在 WPF验证中,了解以下内容之间的区别:
ValidatesOnNotifyDataErrors = True
ValidatesOnDataErrors = True
NotifyOnValidationError = True
什么时候应该在XAML中正确使用这些属性?
答案 0 :(得分:50)
ValidatesOnNotifyDataErrors
和ValidatesOnDataErrors
,ValidatesOnNotifyDataErrors
该接口为{{3}对于ValidatesOnDataErrors
而言,它是INotifyDataErrorInfo
例如,假设你有一个这样的视图模型:
class PersonViewModel : IDataErrorInfo {
public string FirstName {get; set;}
string IDataErrorInfo.Error
{
return string.Empty;
}
string IDataErrorInfo.this[string columnName] {
if (columnName == "FirstName" &&) {
if (this.FirstName.Length > 20)
return "FirstName can't be more than 20 characters.";
}
return string.Empty;
}
}
然后在您的视图中,您有一个绑定到FirstName属性的文本框,如下所示:
<TextBox Text={Binding Path=FirstName, ValidatesOnDataErrors=True} />
现在,如果用户在文本框中输入了20个或更多字符,则会检测到错误。
另一方面,如果希望在绑定验证失败时引发事件,则使用NotifyOnValidationError
。
我通常在我的XAML控件中使用 ValidatesOnDataErrors
进行验证,我不需要其他两个,所以这取决于你的情况。
编辑:我正在更新我的答案,因为我学到了一些新东西,所以我需要让它更具相关性。
ValidatesOnDataErrors
用于胖客户端,或者换句话说,在客户端执行验证时,例如桌面WPF或WinForm应用程序,模型对象实现IDataErrorInfo
。
另一方面,ValidatesOnNotifyDataErrors
更适合瘦客户端(多层应用程序),例如客户端 - 服务器应用程序(Silverlight,带有WCF的WPF,等等。)验证发生在服务器上。
这种方式当用户在TextBox中键入某些内容时,该值将异步发送到服务器进行验证,当验证结果返回时,会引发事件(IDataErrorInfo
事件确切),然后视图选择并使用适当的方法显示它,当然在这种情况下模型将实现INotifyDataErrorInfo
。
答案 1 :(得分:2)
仅为您的信息:WPF中不使用IDataErrorInfo.Error,它可以返回null或引发NotImplementedException。此属性已在WinForms中使用。
我个人更喜欢使用INotifyDataErrorInfo,因为它允许将多个错误消息映射到单个属性。