Свойство 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);
}
Бьерн Страуструп , Бьёрн Страуструп , Валерий Федорович Альмухаметов , Ирина Сергеевна Козлова
Программирование, программы, базы данных / Базы данных / Программирование / Учебная и научная литература / Образование и наука / Книги по IT