INotifyDataErrorInfo 里面只有 3 个东西:
HasErrors
: 一个只读的 bool 属性,它告诉整个对象是否有任何验证错误;
GetErrors
: 返回给定属性的验证错误的方法;
ErrorsChanged
:当检测到新错误或没有错误时必须引发的事件。您必须为每个属性引发此事件。
在演示项目中,我创建了一个表单来显示名为 ‘Person’
的对象的属性。 .以下是如何在绑定(bind)中启用 INotifyDataErrorInfo 验证:
<TextBox Text="{Binding Name,Mode=TwoWay,ValidatesOnNotifyDataErrors=True}"/>
我们必须设置 ValidatesOnNotifyDataErrors
属性(property)true
.
然后绑定(bind)将为绑定(bind)的 Person 的 ErrorsChanged 事件注册自己。每次为绑定(bind)属性引发此事件时,控件都会 self 装饰以显示错误。仅当 HasErrors 设置为 true 时才会执行此操作。
问题:
- 有没有人知道关于
ErrorsChanged event is raised for the binded property, the controls will dress itself to display an error
的更多细节? ? 如果我绑定(bind)
Address.Country
的Person
,将ErrorsChanged
为绑定(bind)属性引发事件Address.Country
或不?为什么?有没有办法让这个绑定(bind)也显示错误?<TextBox Text="{Binding Address.Country,Mode=TwoWay,ValidatesOnNotifyDataErrors=True}"/>
最佳答案
我想我可以冒险回答,这个问题已经一年了。
绑定(bind)将注册到包含该属性的类中的 ErrorsChanged
事件。在这种情况下,Address 必须实现 INotifyDataErrorInfo
。
而且,是您在实现验证逻辑时引发 ErrorsChanged
事件。一旦您验证了 Address.Country,您就可以存储 ValidationResults(或简单的字符串列表)并引发事件。 Binding 将通过调用您自己编写的实现 INotifyDataErrorInfo 接口(interface)的方法 GetErrors(string propertyName)
来获取他绑定(bind)到的 PropertyName 的存储 ValidationResults 列表。
如果此列表不为空,Binding 会将属性 Validation.HasError
设置为 True,并且控件将引发 Validation.Error
事件。某些控件具有在错误情况下更改其外观的内置行为(文本框的边框周围将有一个红色框)。如果要显示错误,则必须通过在 xaml 中编写样式来检索它们。那里有很多例子。
HasErrors
方法用于了解 Person 的属性是否有任何错误。它主要用于这种情况:启用或禁用保存按钮。再一次,您需要使用 HasErrors
属性来实现逻辑。这主要是通过将其绑定(bind)到 xaml 中的控件属性来完成的。
关于c# - INotifyDataErrorInfo。 ErrorsChanged 如何使 wpf 显示属性错误,如 `Address.Country`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28082340/