Свойство HasErrors используется механизмом привязки для выяснения, есть ли GetErrors вызывается со значением null или пустой строкой в параметре propertyName, то он возвращает все ошибки, существующие в экземпляре. Если методу передан параметр propertyName, тогда возвращаются только ошибки, относящиеся к конкретному свойству. Событие ErrorsChanged (подобно событиям PropertyChanged и CollectionChanged) уведомляет механизм привязки о необходимости обновления пользовательского интерфейса для текущего списка ошибок.
Реализация поддерживающего кода
При реализации INotifyDataErrorInfo большая часть кода обычно помещается в базовый класс модели, поэтому она пишется только один раз. Начните с замены IDataErrorInfo интерфейсом INotifyDataErrorInfo в файле класса CarPartial.cs (код для IDataErrorInfo в классе можете оставить; вы обновите его позже).
public partial class Car: INotifyDataErrorInfo, IDataErrorInfo
{
...
public IEnumerable GetErrors(string propertyName)
{
throw new NotImplementedException;
}
public bool HasErrors { get; }
public event
EventHandler
}
Добавьте закрытое поле типа Dictionary, которое будет хранить сведения о любых ошибках, сгруппированные по именам свойств. Понадобится также добавить оператор using для пространства имен System.Collections.Generic. Вот как выглядит код:
using System.Collections.Generic;
private readonly Dictionary
= new Dictionary
Свойство HasErrors должно возвращать true, если в словаре присутствуют
public bool HasErrors => _errors.Any;
Создайте вспомогательный метод для инициирования события ErrorsChanged (подобно инициированию события PropertyChanged):
private void OnErrorsChanged(string propertyName)
{
ErrorsChanged?.Invoke(this,
new DataErrorsChangedEventArgs(propertyName));
}
Как упоминалось ранее, метод GetErrors должен возвращать любые ошибки в словаре, когда в параметре передается пустая строка или null. Если передается допустимое значение propertyName, то возвращаются ошибки, обнаруженные для указанного свойства. Если параметр не соответствует какому-либо свойству (или ошибки для свойства отсутствуют), тогда метод возвратит null.
public IEnumerable GetErrors(string propertyName)
{
if (string.IsNullOrEmpty(propertyName))
{
return _errors.Values;
}
return _errors.ContainsKey(propertyName)
? _errors[propertyName]
: null;
}
Финальный набор вспомогательных методов будет добавлять одну или большее число ошибок для свойства либо очищать все ошибки для свойства (или всех свойств). Не следует забывать о вызове вспомогательного метода OnErrorsChanged каждый раз, когда словарь изменяется.
private void AddError(string propertyName, string error)
{
AddErrors(propertyName, new List
}
private void AddErrors(
string propertyName, IList
{
if (errors == null || !errors.Any)
{
return;
}
var changed = false;
if (!_errors.ContainsKey(propertyName))
{
_errors.Add(propertyName, new List
changed = true;
}
foreach (var err in errors)
{
if (_errors[propertyName].Contains(err)) continue;
_errors[propertyName].Add(err);
changed = true;
}
if (changed)
{
OnErrorsChanged(propertyName);
}
}
protected void ClearErrors(string propertyName = "")
{
if (string.IsNullOrEmpty(propertyName))
{
_errors.Clear;
}
else
{
_errors.Remove(propertyName);
}
OnErrorsChanged(propertyName);
}