60

WPF 验证中,以下内容有什么区别:

ValidatesOnNotifyDataErrors = True

ValidatesOnDataErrors = True

NotifyOnValidationError = True

何时应在 XAML 中正确使用这些属性?

4

2 回答 2

64

ValidatesOnNotifyDataErrors并且ValidatesOnDataErrors在您希望 XAML 绑定控件根据 ViewModel/Model 中实现的接口验证其输入时使用,因为ValidatesOnNotifyDataErrors该接口 isINotifyDataErrorInfo并且 for ValidatesOnDataErrorsit 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

于 2013-06-22T22:59:26.007 回答
8

仅供参考:IDataErrorInfo.Error未在 WPF 中使用,可以返回 null 或抛出NotImplementedException.
此属性在 WinForms 中使用。

就个人而言,我更喜欢使用INotifyDataErrorInfo它,因为它允许将多个错误消息映射到单个属性。

于 2018-10-31T10:57:52.103 回答