在WPF 验证中,以下内容有什么区别:
ValidatesOnNotifyDataErrors = True
ValidatesOnDataErrors = True
NotifyOnValidationError = True
何时应在 XAML 中正确使用这些属性?
在WPF 验证中,以下内容有什么区别:
ValidatesOnNotifyDataErrors = True
ValidatesOnDataErrors = True
NotifyOnValidationError = True
何时应在 XAML 中正确使用这些属性?
ValidatesOnNotifyDataErrors
并且ValidatesOnDataErrors
在您希望 XAML 绑定控件根据 ViewModel/Model 中实现的接口验证其输入时使用,因为ValidatesOnNotifyDataErrors
该接口 isINotifyDataErrorInfo
并且 for ValidatesOnDataErrors
it is IDataErrorInfo
。
例如,假设您有一个这样的视图模型:
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
,当您希望在绑定验证失败时引发事件时使用。
我通常ValidatesOnDataErrors
在我的 XAML 控件中使用验证,而我不需要其他两个,所以这取决于你的情况。
编辑:我正在更新我的答案,因为我学到了一些新东西,所以我需要让它更相关。
ValidatesOnDataErrors
在胖客户端中使用,或者换句话说,当在客户端(例如桌面 WPF 或 WinForm 应用程序和模型对象实现)上执行验证时IDataErrorInfo
。
另一方面,ValidatesOnNotifyDataErrors
更适合在服务器上进行验证的瘦客户端(多层应用程序),例如客户端-服务器应用程序(Silverlight、带有 WCF 的 WPF 等)。
这样,当用户在 TextBox 中键入某些内容时,该值会异步发送到服务器进行验证,当验证结果返回时会引发一个事件(确切地说是ErrorsChanged事件),然后视图会选择并显示它使用适当的方法,当然在这种情况下模型将实现INotifyDataErrorInfo
。
仅供参考:IDataErrorInfo.Error
未在 WPF 中使用,可以返回 null 或抛出NotImplementedException
.
此属性在 WinForms 中使用。
就个人而言,我更喜欢使用INotifyDataErrorInfo
它,因为它允许将多个错误消息映射到单个属性。