关于 IDataErrorInfo 接口的几个问题

A few questions on IDataErrorInfo Interface

我查看了几个实现 IDataErrorInfo 接口的例子,所有这些实现都有点像这样:

public string Error => null;
public string this[string columnName] {
    get {
        string res = null;
        switch (columnName) {
            case "FirstName":
                if (FirstName != "test") res = "First Name Invalid!";
                break;
            case "LastName":
                if (LastName != "test") res = "Last Name Invalid!";
                break;
        }
        return res;
    }
}

public string Error 的用途是什么以及如何使用它而不是返回 null?在 xaml 中,其中一些示例使用了预定义样式定位 TextBox,而其他示例使用了 LabelToolTip,如下所示:

<TextBox x:Name="Fname" 
         Text="{Binding FirstName, UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=True}" 
         ToolTip="{Binding ElementName=Fname, Path=(Validation.Errors)[0].ErrorContent}" />

<Label Content="{Binding ElementName=Fname, Path=(Validation.Errors).CurrentItem.ErrorContent}"/>

x:Name="Fname"ElementName=Fname用作ToolTip并缩短表达式(Validation.Errors)[0].ErrorContent时,我可以避免ElementName=Fname吗?


编辑

可能 DataAnnotations 是验证个人 属性 以及整个 model/viewmodel 以及这些的最优雅的方法:

public string Error => null;
public string this[string columnName] {
    get {
        var validationResults = new List<ValidationResult>();
        if (Validator.TryValidateProperty(
            GetType().GetProperty(columnName).GetValue(this), 
            new ValidationContext(this) { MemberName = columnName }, 
            validationResults
            )) return null;

        return validationResults.First().ErrorMessage;
    }
}

为了验证整个模型,我应该调用:

Validator.TryValidateObject(this, new ValidationContext(this), null, true);

CanExecuteICommand。这个例子也没有使用 public string Error.

WPF 绑定引擎会忽略 Error 属性,因此您只需关心实现索引器。

顺便说一句,自 .NET Framework 4.5 以来,建议实现和使用 INotifyDataErrorInfo 接口而不是 IDataErrorInfo