INotifyDataErrorInfo。 ErrorsChanged如何使wpf显示属性的错误,如`Address.Country`

时间:2015-01-22 06:16:16

标签: c# wpf validation mvvm inotifydataerrorinfo

INotifyDataErrorInfo中只有3件事:

HasErrors:一个只读布尔属性,它告诉整个对象是否有任何验证错误;
GetErrors:返回给定属性的验证错误的方法;
ErrorsChanged:当检测到新错误或缺少错误时必须引发的事件。您必须为每个房产举办此活动。


在演示项目中,我创建了一个表单,显示名为‘Person’的对象的属性。以下是在Binding中启用INotifyDataErrorInfo验证的方法:

<TextBox Text="{Binding Name,Mode=TwoWay,ValidatesOnNotifyDataErrors=True}"/>

我们必须将ValidatesOnNotifyDataErrors属性设置为true

然后,绑定将为绑定Person的ErrorsChanged事件注册自己。对于绑定属性引发此事件的时间,控件将自行装扮以显示错误。仅当HasErrors设置为true时才会执行此操作。


问题:

  1. 是否有人知道ErrorsChanged event is raised for the binded property, the controls will dress itself to display an error的详细信息?
  2. 如果我绑定Address.Country的{​​{1}},是否会为绑定的属性Person引发ErrorsChanged事件?为什么?有没有办法使这个绑定也显示错误?

    Address.Country

1 个答案:

答案 0 :(得分:1)

我想我可以冒回答,这个问题已经有一年了。

Binding将注册到包含该属性的Class中的ErrorsChanged事件。在这种情况下,地址必须实现INotifyDataErrorChanged

并且,您在实现验证逻辑时提升ErrorsChanged事件。验证Address.Country后,存储ValidationResults(或简单字符串列表)并引发事件。 Binding将通过调用您自己编写的实现INotifyDataErrorInfo接口的方法GetErrors(string propertyName)来获取存储的绑定PropertyName的ValidationResults列表。

如果此列表不为空,则Binding会将Property Validation.HasError设置为True,控件将引发Validation.Error事件。某些控件具有内置行为,可以在错误情况下更改其外观(TextBox的边框周围会有红框)。如果要显示错误,则必须通过在xaml中编写样式来检索它们。那里有很多例子。

如果您想知道Person在其Properties中是否有任何错误,则使用HasErrors方法。它主要用于这种情况:启用或禁用保存按钮。再次,您可以使用HasErrors属性来实现逻辑。它主要通过将其绑定到xaml中的控件属性来完成。