Несколько вопросов по интерфейсу IDataErrorInfo - PullRequest
0 голосов
/ 15 октября 2019

Я рассмотрел несколько примеров реализации интерфейса 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, а другие использовали Label или ToolTip, например:

<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 из ICommand. Этот пример также не использовал public string Error.

1 Ответ

1 голос
/ 21 октября 2019

Свойство Error игнорируется механизмом привязки WPF, поэтому вам нужно только позаботиться о реализации индексатора.

Кстати, рекомендуется реализовать и использовать интерфейс INotifyDataErrorInfo вместоIDataErrorInfo начиная с .NET Framework 4.5.

...