繁体   English   中英

如何为自定义WPF控件实现(冒泡)验证事件

[英]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);
});

我当时在想,如果要实现IDataErrorInfoINotifyDataErrorInfo ,WPF会以某种方式神奇地为我处理内容,并创建ValidationError事件(该事件会冒泡到UserControl 。但是显然,我在这里缺少了一些重要的东西。)

我的问题是:我必须在自定义控件PercentTextbox中实现什么才能在任意位置使用它,并且仍然可以获得可以在容器UserControl使用的某种冒泡验证信息(例如,禁用SaveButton)。

IDataErrorInfoINotifyDataErrorInfo应该在模型端而不是UI端实现。 然后,可以在Binding上设置ValidatesOnDataErrors = TrueValidatesOnNotifyDataErrors = True选项,以便使绑定验证系统跳入其中。网络上有一些不错的教程。 不是UI告诉您某些内容无效,而是该UI表示的数据。

数据验证概念与数据绑定紧密结合。 如果希望用户控件执行其自己的“ UI”验证,请使用依赖项属性的强制和验证回调 但是,这与绑定系统的数据验证无关。 验证回调将导致属性系统引发您可以根据需要处理的异常(例如,可以将ExceptionValidationRule用于绑定)。

看一下Validation.Error附加事件文档 (实际上您是通过调用Validation.AddErrorHandler来尝试观察的)。 它指出:

在绑定元素遇到验证错误时发生, 但仅对于NotifyOnValidationError值设置为true的绑定发生

因此,您现在有两个选择:

  • 在模型端实现验证并相应地设置绑定(对于绑定到自定义控件属性的每个绑定,您都必须执行此操作)
  • 使用依赖项属性验证回调

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM