[英]How to implement (bubbling) validation events for custom WPF control
我已经开发了一个自定义WPF控件:
public partial class PercentTextbox : UserControl, IDataErrorInfo, INotifyDataErrorInfo
然后将该UserControl
与其他一些UserControl
一起放入UserControl
:
<UserControl x:Class="UserControlContainingPercentTextboxAndStuff" DataContext="Something" ...>
<Grid>
<mycontrols:PercentTextbox Value="{Binding MyPercentageValue, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, NotifyOnValidationError=True}" ... />
<TextBox ... />
<mycontrols:PercentTextbox ... />
<TextBox ... />
<TextBox ... />
</Grid>
</UserControl>
最后,我使用另一个包装的UserControl
将上述UserControl
显示为对话框:
<UserControl ...>
<Grid>
<local:UserControlContainingPercentTextboxAndStuff ... />
<Button x:Name="SaveButton" Content="Save" ... />
<Button x:Name="CancelButton" Content="Cancel" ... />
</Grid>
</UserControl>
在后者后面的代码中,我要订阅所有验证错误,如果有错误,请禁用保存按钮。
Validation.AddErrorHandler(this, (sender, e) =>
{
SaveButton.IsEnabled = false;
Debug.WriteLine(e.Error);
});
我当时在想,如果要实现IDataErrorInfo
或INotifyDataErrorInfo
,WPF会以某种方式神奇地为我处理内容,并创建ValidationError事件(该事件会冒泡到UserControl
。但是显然,我在这里缺少了一些重要的东西。)
我的问题是:我必须在自定义控件PercentTextbox
中实现什么才能在任意位置使用它,并且仍然可以获得可以在容器UserControl
使用的某种冒泡验证信息(例如,禁用SaveButton)。
IDataErrorInfo
和INotifyDataErrorInfo
应该在模型端而不是UI端实现。 然后,可以在Binding
上设置ValidatesOnDataErrors = True
或ValidatesOnNotifyDataErrors = True
选项,以便使绑定验证系统跳入其中。网络上有一些不错的教程。 不是UI告诉您某些内容无效,而是该UI表示的数据。
数据验证概念与数据绑定紧密结合。 如果希望用户控件执行其自己的“ UI”验证,请使用依赖项属性的强制和验证回调 。 但是,这与绑定系统的数据验证无关。 验证回调将导致属性系统引发您可以根据需要处理的异常(例如,可以将ExceptionValidationRule
用于绑定)。
看一下Validation.Error
附加事件文档 (实际上您是通过调用Validation.AddErrorHandler
来尝试观察的)。 它指出:
在绑定元素遇到验证错误时发生, 但仅对于NotifyOnValidationError值设置为true的绑定发生 。
因此,您现在有两个选择:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.