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
:
ItemsSource="{Binding ElementName=DetailsGrid, Path=(Validation.Errors)}">
Добавьте к ListBox
элемент DataTemplate
, а в него — элемент управления ListBox
, привязанный к свойству ErrorContent
. Контекстом данных для каждого элемента ListBoxItem
в этом случае является объект ValidationError
, так что устанавливать контекст данных не придется, а только путь. Установите путь привязки в ErrorContent
:
Запустите приложение, выберите автомобиль Chevy
и установите цвет в Pink
. В окне отобразятся ошибки (рис. 28.4).
Мы лишь слегка коснулись поверхности того, что можно делать при проверке достоверности и отображении сообщений об ошибках, но представленных сведений должно быть вполне достаточно для выработки вами способа разработки информативных пользовательских интерфейсов, которые улучшают восприятие.
Перемещение поддерживающего кода в базовый класс
Вероятно, вы заметили, что в настоящий момент в классе CarPartial
присутствует много кода. Поскольку в рассматриваемом примере есть только один класс модели, проблемы не возникают. Но по мере появления новых моделей в реальном приложении добавлять весь связующий код в каждый частичный класс для моделей нежелательно. Гораздо эффективнее поместить поддерживающий код в базовый класс, что и будет сделано.
Создайте в папке Models
новый файл класса по имени BaseEntity.cs
. Добавьте в него операторы using
для пространств имен System.Collections
и System.ComponentModel
. Пометьте класс как открытый и обеспечьте реализацию им интерфейса INotifyDataErrorInfor
.
using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
namespace Validations.Models
{
public class BaseEntity : INotifyDataErrorInfo
}