INotifyDataErrorInfo实体级验证。如何引发Validation.Error事件?

时间:2013-09-06 06:01:21

标签: c# wpf inotifydataerrorinfo

我有以下问题:

我正在使用INotifyDataErrorInfo验证来验证我的模型。 现在我需要在“实体级”上验证我的模型,以便验证模型对象的整个状态。

这一切都正常,验证规则会返回错误,但我现在如何确保为我的模型引发Validation.Error事件,以便在MainWindow-Level中捕获它以显示错误消息?

对于我的属性,我在xaml中编写以下内容,以便引发Validation.Error事件:

<TextBox Text="{Binding PropertyName, ValidatesOnNotifyDataErrors=True, NotifyOnValidationError=True}" />

如果有人可以为我提供一个工作示例,我会很高兴,谢谢!

2 个答案:

答案 0 :(得分:2)

@ninja hedgehog:是的,我知道,但问题是获得模型级错误的事件。

但现在我找到了解决问题的方法。

如果要为整个Model提供Validation.Error事件,则必须在父控件上进行例如DataContext的绑定。 以下示例将解释我的意思:

<Grid DataContext="{Binding ., ValidatesOnNotifyDataErrors=True, NotifyOnValidationError=True}">

    <TextBox Text="{Binding PropertyName, ValidatesOnNotifyDataErrors=True, NotifyOnValidationError=True}" />

    <TextBox Text="{Binding PropertyName1, ValidatesOnNotifyDataErrors=True, NotifyOnValidationError=True}" />

    <TextBox Text="{Binding PropertyName2, ValidatesOnNotifyDataErrors=True, NotifyOnValidationError=True}" />

</Grid>

因此,Grid上DataContext的Binding现在会侦听Model的INotifyDataErrorInfo.ErrorsChanged事件,如果出现错误,则会为整个模型引发Validation.Error RoutedEvent。

答案 1 :(得分:1)

Event Validation.Error是一个RoutedEvent,一旦你的验证在绑定中返回false,它就会一直被提升。

<StackPanel Validation.Error="OnError">
  <TextBox Text="{Binding PropertyName, ValidatesOnNotifyDataErrors=True, NotifyOnValidationError=True}" />
</StackPanel>

在MainWindow背后的代码中,你需要这样的东西:

public void OnError(object sender, ....)
{
 ....
}