Язык программирования C#9 и платформа .NET5
Шрифт:
Реализация поддерживающего кода
При реализации
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<DataErrorsChangedEventArgs> ErrorsChanged;
}
Добавьте
Dictionary<string,List<string>>
, которое будет хранить сведения о любых ошибках, сгруппированные по именам свойств. Понадобится также добавить оператор using
для пространства имен System.Collections.Generic
. Вот как выглядит код:
using System.Collections.Generic;
private readonly Dictionary<string,List<string>> _errors
= new Dictionary<string, List<string>>;
Свойство
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<string> { error });
}
private void AddErrors(
string propertyName, IList<string> errors)
{
if (errors == null || !errors.Any)
{
return;
}
var changed = false;
if (!_errors.ContainsKey(propertyName))
{
_errors.Add(propertyName, new List<string>);
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);
}
Возникает вопрос: когда приведенный выше код активизируется? Механизм привязки прослушивает событие
ErrorsChanged
и обновляет пользовательский интерфейс, если в коллекции ошибок для выражения привязки возникает изменение. Но код проверки по-прежнему нуждается в триггере для запуска. Доступны два механизма, которые обсуждаются далее. Использование интерфейса INotifyDataErrorInfo для проверки достоверности
Одним из мест выполнения проверки на предмет ошибок являются блоки
set
для свойств, как демонстрируется в показанном ниже примере, упрощенном до единственной проверки на равенство свойства Make
значению ModelT
:
public string Make
{
get { return _make; }
set
Поделиться:
Популярные книги
Месть Пламенных
6. Пламенная
Фантастика:
фэнтези
6.00
рейтинг книги
Королевская Академия Магии. Неестественный Отбор
Любовные романы:
любовно-фантастические романы
8.22
рейтинг книги
Имперец. Том 3
2. Имперец
Фантастика:
боевая фантастика
попаданцы
альтернативная история
7.43
рейтинг книги
Бракованная невеста. Академия драконов
Фантастика:
фэнтези
сказочная фантастика
5.00
рейтинг книги
Темный Лекарь 7
7. Темный Лекарь
Фантастика:
попаданцы
аниме
фэнтези
5.75
рейтинг книги
Кодекс Охотника. Книга XIII
13. Кодекс Охотника
Фантастика:
боевая фантастика
попаданцы
аниме
7.50
рейтинг книги
Низший - Инфериор. Компиляция. Книги 1-19
Фантастика 2023. Компиляция
Фантастика:
боевая фантастика
5.00
рейтинг книги
Магия чистых душ 2
Любовные романы:
любовно-фантастические романы
5.56
рейтинг книги
Курсант: Назад в СССР 11
11. Курсант
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Назад в СССР 5
5. Курсант
Фантастика:
попаданцы
альтернативная история
6.64
рейтинг книги
Черный Маг Императора 7 (CИ)
7. Черный маг императора
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Машенька и опер Медведев
1. Накосячившие опера
Любовные романы:
современные любовные романы
6.40
рейтинг книги
Отмороженный 4.0
4. Отмороженный
Фантастика:
боевая фантастика
постапокалипсис
рпг
5.00
рейтинг книги
Покоривший СТЕНУ 6: Пламя внутри
6. Покоривший СТЕНУ
Фантастика:
фэнтези
попаданцы
рпг
5.00