Чтение онлайн

на главную - закладки

Жанры

Язык программирования 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

Поделиться:
Популярные книги

Газлайтер. Том 8

Володин Григорий
8. История Телепата
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Газлайтер. Том 8

На Ларэде

Кронос Александр
3. Лэрн
Фантастика:
фэнтези
героическая фантастика
стимпанк
5.00
рейтинг книги
На Ларэде

Охота на попаданку. Бракованная жена

Герр Ольга
Любовные романы:
любовно-фантастические романы
5.60
рейтинг книги
Охота на попаданку. Бракованная жена

Кай из рода красных драконов

Бэд Кристиан
1. Красная кость
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Кай из рода красных драконов

Хозяйка Проклятой Пустоши. Книга 2

Белецкая Наталья
2. Хозяйка Проклятой Пустоши
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Хозяйка Проклятой Пустоши. Книга 2

Безумный Макс. Поручик Империи

Ланцов Михаил Алексеевич
1. Безумный Макс
Фантастика:
героическая фантастика
альтернативная история
7.64
рейтинг книги
Безумный Макс. Поручик Империи

Потусторонний. Книга 2

Погуляй Юрий Александрович
2. Господин Артемьев
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Потусторонний. Книга 2

Чапаев и пустота

Пелевин Виктор Олегович
Проза:
современная проза
8.39
рейтинг книги
Чапаев и пустота

Солнечный корт

Сакавич Нора
4. Все ради игры
Фантастика:
зарубежная фантастика
5.00
рейтинг книги
Солнечный корт

Лютая

Шёпот Светлана Богдановна
Любовные романы:
любовно-фантастические романы
6.40
рейтинг книги
Лютая

Ведьмак (большой сборник)

Сапковский Анджей
Ведьмак
Фантастика:
фэнтези
9.29
рейтинг книги
Ведьмак (большой сборник)

Наследие Маозари 4

Панежин Евгений
4. Наследие Маозари
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Наследие Маозари 4

Ученик

Губарев Алексей
1. Тай Фун
Фантастика:
фэнтези
5.00
рейтинг книги
Ученик

Начальник милиции. Книга 5

Дамиров Рафаэль
5. Начальник милиции
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Начальник милиции. Книга 5