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

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

Жанры

Язык программирования C#9 и платформа .NET5
Шрифт:

Начните с добавления оператора

switch
для каждого свойства. Во избежание применения "магических" строк в операторах
case
вы снова будете использовать операцию
nameof
. В случае сквозного прохода через оператор
switch
возвращается
string.Empty
. Далее добавьте правила проверки достоверности. В подходящих операторах
case
реализуйте проверку значения свойства на основе приведенных выше правил. В операторе
case
для свойства
Make
первым делом проверьте, равно ли значение
ModelT
. Если это так, тогда возвратите сообщение об ошибке. В случае успешного
прохождения проверки в следующей строке кода вызовите вспомогательный метод, который возвратит сообщение об ошибке, если нарушено второе правило, или
string.Empty
, если нет. В операторе
case
для свойства
Color
просто вызовите тот же вспомогательный метод. Ниже показан код:

public string this[string columnName]

{

get

{

switch (columnName)

{

case nameof(Id):

break;

case nameof(Make):

return Make == "ModelT"

? "Too Old"

: CheckMakeAndColor;

case nameof(Color):

return CheckMakeAndColor;

case nameof(PetName):

break;

}

return string.Empty;

}

}

internal string CheckMakeAndColor

{

if (Make == "Chevy" && Color == "Pink")

{

return $"{Make}'s don't come in {Color}";

}

return string.Empty;

}

Запустите приложение, выберите автомобиль

Red Rider
(
Ford
) и измените значение в поле Make (Производитель) на
ModelT
. После того, как фокус покинет поле, появится декоратор ошибки красного цвета. Выберите в поле со списком автомобиль
Kit
(
Chevy
) и щелкните на кнопке Change Color, чтобы изменить его цвет на
Pink
. Вокруг поля
Color
незамедлительно появится декоратор ошибки красного цвета, но возле поля Make он будет отсутствовать. Измените значение в поле Make на
Ford
и переместите фокус из этого поля; декоратор ошибки красного цвета не появляется!

Причина в том, что индексатор выполняется, только когда для свойства сгенерировано событие

PropertyChanged
. Как обсуждалось в разделе "Система уведомлений привязки WPF" ранее в главе, событие
PropertyChanged
инициируется при изменении исходного значения свойства объекта, что происходит либо через код (вроде обработчика события
Click
для кнопки Change Color), либо через взаимодействие с пользователем (синхронизируется с помощью
UpdateSourceTrigger
). При изменении цвета свойство Make не изменяется, а потому событие
PropertyChanged
для него не генерируется. Поскольку событие не генерируется, индексатор не вызывается и проверка достоверности для свойства
Make
не выполняется.

Решить проблему можно двумя путями. Первый предусматривает изменение объекта

PropertyChangedEventArgs
, которое обеспечит обновление всех привязанных свойств, за счет передачи его конструктору значения
string.Empty
вместо имени поля. Как упоминалось ранее, это заставит механизм привязки обновить каждое свойство в данном экземпляре. Добавьте метод
OnPropertyChanged
со следующим кодом:

protected virtual void OnPropertyChanged([CallerMemberName]

string propertyName = "")

{

if (propertyName != nameof(IsChanged))

{

IsChanged = true;

}

//PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));

PropertyChanged?.Invoke(this,

new PropertyChangedEventArgs(string.Empty));

}

Теперь при выполнении того же самого теста текстовые поля Make и Color декорируются с помощью шаблона отображения ошибки, когда одно из них обновляется. Так почему бы ни генерировать событие всегда в такой манере? В значительной степени причиной является производительность. Вполне возможно, что обновление каждого свойства объекта приведет к снижению производительности. Разумеется, без тестирования об этом утверждать нельзя, и конкретные ситуации могут (и вероятно будут) варьироваться.

Другое решение предполагает генерацию события

PropertyChanged
для зависимого поля (полей), когда одно из полей изменяется. Недостаток такого приема в том, что вы (или другие разработчики, сопровождающие ваше приложение) должны знать о взаимосвязи между свойствами
Make
и
Color
через код проверки достоверности.

Интерфейс INotifyDataErrorInfo

Интерфейс

INotifyDataErrorInfo
, появившийся в версии .NET 4.5, построен на основе интерфейса
IDataErrorInfo
и предлагает дополнительные возможности для проверки достоверности. Конечно, возросшая мощь сопровождается дополнительной работой! По разительному контрасту с предшествующими приемами проверки достоверности, которые вы видели до сих пор, свойство привязки
ValidatesOnNotifyDataErrors
имеет стандартное значение
true
, поэтому добавлять его к операторам привязки не обязательно.

Интерфейс

INotifyDataErrorInfo
чрезвычайно мал, но, как вскоре будет показано, для обеспечения своей эффективности требует написания порядочного объема связующего кода. Ниже приведено определение интерфейса
INotifyDataErrorInfo
:

public interface INotifyDataErrorInfo

{

bool HasErrors { get; }

event EventHandler<DataErrorsChangedEventArgs>

ErrorsChanged;

IEnumerable GetErrors(string propertyName);

}

Свойство

HasErrors
используется механизмом привязки для выяснения, есть ли какие-нибудь ошибки в любых свойствах экземпляра. Если метод
GetErrors
вызывается со значением
null
или пустой строкой в параметре
propertyName
, то он возвращает все ошибки, существующие в экземпляре. Если методу передан параметр
propertyName
, тогда возвращаются только ошибки, относящиеся к конкретному свойству. Событие
ErrorsChanged
(подобно событиям
PropertyChanged
и
CollectionChanged
) уведомляет механизм привязки о необходимости обновления пользовательского интерфейса для текущего списка ошибок.

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

Блуждающие огни 4

Панченко Андрей Алексеевич
4. Блуждающие огни
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Блуждающие огни 4

Я сделаю это сама

Кальк Салма
1. Магический XVIII век
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Я сделаю это сама

Флеш Рояль

Тоцка Тала
Детективы:
триллеры
7.11
рейтинг книги
Флеш Рояль

Боярышня Дуняша

Меллер Юлия Викторовна
1. Боярышня
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Боярышня Дуняша

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

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

Леди для короля. Оборотная сторона короны

Воронцова Александра
3. Королевская охота
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Леди для короля. Оборотная сторона короны

На границе империй. Том 10. Часть 1

INDIGO
Вселенная EVE Online
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 10. Часть 1

Черный Маг Императора 5

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

Невест так много. Дилогия

Завойчинская Милена
Невест так много
Любовные романы:
любовно-фантастические романы
7.62
рейтинг книги
Невест так много. Дилогия

Идеальный мир для Социопата 3

Сапфир Олег
3. Социопат
Фантастика:
боевая фантастика
6.17
рейтинг книги
Идеальный мир для Социопата 3

Повелитель механического легиона. Том VIII

Лисицин Евгений
8. Повелитель механического легиона
Фантастика:
технофэнтези
аниме
фэнтези
5.00
рейтинг книги
Повелитель механического легиона. Том VIII

Наследник павшего дома. Том I

Вайс Александр
1. Расколотый мир
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Наследник павшего дома. Том I

Крещение огнем

Сапковский Анджей
5. Ведьмак
Фантастика:
фэнтези
9.40
рейтинг книги
Крещение огнем

Камень Книга двенадцатая

Минин Станислав
12. Камень
Фантастика:
боевая фантастика
городское фэнтези
аниме
фэнтези
5.00
рейтинг книги
Камень Книга двенадцатая