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

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

Жанры

Язык программирования 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
рейтинг книги
Имперец. Том 3

Бракованная невеста. Академия драконов

Милославская Анастасия
Фантастика:
фэнтези
сказочная фантастика
5.00
рейтинг книги
Бракованная невеста. Академия драконов

Темный Лекарь 7

Токсик Саша
7. Темный Лекарь
Фантастика:
попаданцы
аниме
фэнтези
5.75
рейтинг книги
Темный Лекарь 7

Кодекс Охотника. Книга XIII

Винокуров Юрий
13. Кодекс Охотника
Фантастика:
боевая фантастика
попаданцы
аниме
7.50
рейтинг книги
Кодекс Охотника. Книга XIII

Низший - Инфериор. Компиляция. Книги 1-19

Михайлов Дем Алексеевич
Фантастика 2023. Компиляция
Фантастика:
боевая фантастика
5.00
рейтинг книги
Низший - Инфериор. Компиляция. Книги 1-19

Магия чистых душ 2

Шах Ольга
Любовные романы:
любовно-фантастические романы
5.56
рейтинг книги
Магия чистых душ 2

Курсант: Назад в СССР 11

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

Назад в СССР 5

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

Черный Маг Императора 7 (CИ)

Герда Александр
7. Черный маг императора
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Черный Маг Императора 7 (CИ)

Машенька и опер Медведев

Рам Янка
1. Накосячившие опера
Любовные романы:
современные любовные романы
6.40
рейтинг книги
Машенька и опер Медведев

Отмороженный 4.0

Гарцевич Евгений Александрович
4. Отмороженный
Фантастика:
боевая фантастика
постапокалипсис
рпг
5.00
рейтинг книги
Отмороженный 4.0

Покоривший СТЕНУ 6: Пламя внутри

Мантикор Артемис
6. Покоривший СТЕНУ
Фантастика:
фэнтези
попаданцы
рпг
5.00
рейтинг книги
Покоривший СТЕНУ 6: Пламя внутри