Язык программирования 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). Мы лишь слегка коснулись поверхности того, что можно делать при проверке достоверности и отображении сообщений об ошибках, но представленных сведений должно быть вполне достаточно для выработки вами способа разработки информативных пользовательских интерфейсов, которые улучшают восприятие.
Поделиться:
Популярные книги
Газлайтер. Том 8
8. История Телепата
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
На Ларэде
3. Лэрн
Фантастика:
фэнтези
героическая фантастика
стимпанк
5.00
рейтинг книги
Охота на попаданку. Бракованная жена
Любовные романы:
любовно-фантастические романы
5.60
рейтинг книги
Кай из рода красных драконов
1. Красная кость
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Хозяйка Проклятой Пустоши. Книга 2
2. Хозяйка Проклятой Пустоши
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Безумный Макс. Поручик Империи
1. Безумный Макс
Фантастика:
героическая фантастика
альтернативная история
7.64
рейтинг книги
Потусторонний. Книга 2
2. Господин Артемьев
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Чапаев и пустота
Проза:
современная проза
8.39
рейтинг книги
Солнечный корт
4. Все ради игры
Фантастика:
зарубежная фантастика
5.00
рейтинг книги
Лютая
Любовные романы:
любовно-фантастические романы
6.40
рейтинг книги
Ведьмак (большой сборник)
Ведьмак
Фантастика:
фэнтези
9.29
рейтинг книги
Наследие Маозари 4
4. Наследие Маозари
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Ученик
1. Тай Фун
Фантастика:
фэнтези
5.00
рейтинг книги
Начальник милиции. Книга 5
5. Начальник милиции
Фантастика:
попаданцы
альтернативная история
5.00