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

на главную

Жанры

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

{

if (value == _make) return;

_make = value;

if (Make == "ModelT")

{

AddError(nameof(Make), "Too Old");

}

else

{

ClearErrors(nameof(Make));

}

OnPropertyChanged(nameof(Make));

OnPropertyChanged(nameof(Color));

}

}

Основная

проблема такого подхода состоит в том, что вам приходится сочетать логику проверки достоверности с блоками
set
для свойств, что делает код труднее в чтении и сопровождении.

Комбинирование IDataErrorInfo С INotifyDataErrorInfo для проверки достоверности

В предыдущем разделе было показано, что реализацию интерфейса

IDataErrorInfo
можно добавить к частичному классу, т.е. обновлять блоки
set
не понадобится. Кроме того, индексатор автоматически вызывается при возникновении события
PropertyChanged
в свойстве. Комбинирование
IDataErrorInfo
и
INotifyDataErrorInfo
предоставляет дополнительные возможности для проверки достоверности из
INotifyDataErrorInfo
, а также отделение от блоков
set
, обеспечиваемое
IDataErrorInfo
.

Цель применения

IDataErrorInfo
не в том, чтобы запускать проверку достоверности, а в том, чтобы гарантировать вызов кода проверки, который задействует
INotifyDataErrorInfo
, каждый раз, когда для объекта генерируется событие
PropertyChanged
. Поскольку интерфейс
IDataErrorInfo
не используется для проверки достоверности, необходимо всегда возвращать
string.Empty
из индексатора. Модифицируйте индексатор и вспомогательный метод
CheckMakeAndColor
следующим образом:

public string this[string columnName]

{

get

{

ClearErrors(columnName);

switch (columnName)

{

case nameof(Id):

break;

case nameof(Make):

CheckMakeAndColor;

if (Make == "ModelT")

{

AddError(nameof(Make), "Too Old");

hasError = true;

}

break;

case nameof(Color):

CheckMakeAndColor;

break;

case nameof(PetName):

break;

}

return string.Empty;

}

}

internal bool CheckMakeAndColor

{

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

{

AddError(nameof(Make), $"{Make}'s don't come in {Color}");

AddError(nameof(Color),

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

return true;

}

return false;

}

Запустите приложение,

выберите автомобиль
Chevy
и измените цвет на
Pink
. В дополнение к декораторам красного цвета вокруг текстовых полей Make и Model будет также отображаться декоратор в виде красного прямоугольника, охватывающего целиком всю сетку, в которой находятся поля с детальной информацией об автомобиле (рис. 28.3).

Это еще одно преимущество применения интерфейса

INotifyDataErrorInfo
. В дополнение к элементам управления, которые содержат ошибки, элемент управления, определяющий контекст данных, также декорируется шаблоном отображения ошибки.

Отображение всех ошибок

Свойство

Errors
класса
Validation
возвращает все ошибки проверки достоверности для конкретного объекта в форме объектов
ValidationError
. Каждый объект
ValidationError
имеет свойство
ErrorContent
, которое содержит список сообщений об ошибках для свойства. Это означает, что сообщения об ошибках, которые нужно отобразить, находятся в списке внутри списка. Чтобы вывести их надлежащим образом, понадобится создать элемент
ListBox
, содержащий еще один элемент
ListBox
. Звучит слегка запутанно, но вскоре все прояснится.

Первым делом добавьте одну строку в

DetailsGrid
и удостоверьтесь в том, что значение свойства
Height
элемента
Window
составляет не менее
300
. Поместите в последнюю строку элемент управления
ListBox
и привяжите его свойство
ItemsSource
к
DetailsGrid
, используя
Validation.Errors
для
Path
:

<ListBox Grid.Row="6" Grid.Column="0" Grid.ColumnSpan="2"

ItemsSource="{Binding ElementName=DetailsGrid, Path=(Validation.Errors)}">

</ListBox>

Добавьте к

ListBox
элемент
DataTemplate
, а в него — элемент управления
ListBox
, привязанный к свойству
ErrorContent
. Контекстом данных для каждого элемента
ListBoxItem
в этом случае является объект
ValidationError
, так что устанавливать контекст данных не придется, а только путь. Установите путь привязки в
ErrorContent
:

<ListBox.ItemTemplate>

<DataTemplate>

<ListBox ItemsSource="{Binding Path=ErrorContent}"/>

</DataTemplate>

</ListBox.ItemTemplate>

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

Chevy
и установите цвет в
Pink
. В окне отобразятся ошибки (рис. 28.4).

Мы лишь слегка коснулись поверхности того, что можно делать при проверке достоверности и отображении сообщений об ошибках, но представленных сведений должно быть вполне достаточно для выработки вами способа разработки информативных пользовательских интерфейсов, которые улучшают восприятие.

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

Барон нарушает правила

Ренгач Евгений
3. Закон сильного
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Барон нарушает правила

Помещица Бедная Лиза

Шах Ольга
Любовные романы:
любовно-фантастические романы
6.40
рейтинг книги
Помещица Бедная Лиза

Бальмануг. Студентка

Лашина Полина
2. Мир Десяти
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Бальмануг. Студентка

Изменить нельзя простить

Томченко Анна
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Изменить нельзя простить

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

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

Жандарм 4

Семин Никита
4. Жандарм
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Жандарм 4

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

Винокуров Юрий
10. Кодекс Охотника
Фантастика:
фэнтези
попаданцы
аниме
6.25
рейтинг книги
Кодекс Охотника. Книга X

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

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

Пипец Котенку!

Майерс Александр
1. РОС: Пипец Котенку!
Фантастика:
фэнтези
юмористическое фэнтези
аниме
5.00
рейтинг книги
Пипец Котенку!

АН (цикл 11 книг)

Тарс Элиан
Аномальный наследник
Фантастика:
фэнтези
героическая фантастика
попаданцы
аниме
5.00
рейтинг книги
АН (цикл 11 книг)

Толян и его команда

Иванов Дмитрий
6. Девяностые
Фантастика:
попаданцы
альтернативная история
7.17
рейтинг книги
Толян и его команда

Пятое правило дворянина

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

Игрок, забравшийся на вершину. Том 8

Михалек Дмитрий Владимирович
8. Игрок, забравшийся на вершину
Фантастика:
фэнтези
рпг
5.00
рейтинг книги
Игрок, забравшийся на вершину. Том 8

Возвышение Меркурия. Книга 7

Кронос Александр
7. Меркурий
Фантастика:
героическая фантастика
попаданцы
аниме
5.00
рейтинг книги
Возвышение Меркурия. Книга 7