有关IDataErrorInfo接口的几个问题

时间:2019-10-15 17:58:21

标签: .net-core idataerrorinfo

我看了一些实现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吗?


编辑

可能DataAnnotations是验证单个属性以及整个模型/视图模型以及这些属性的最优雅方法:

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);
CanExecute的{​​{1}}中

。此示例也未使用ICommand

1 个答案:

答案 0 :(得分:1)

WPF绑定引擎将忽略Error属性,因此您只需要考虑实现索引器即可。

从.NET Framework 4.5开始,建议实现并使用INotifyDataErrorInfo接口而不是IDataErrorInfo接口。