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
. Звучит слегка запутанно, но вскоре все прояснится.
Мы лишь слегка коснулись поверхности того, что можно делать при проверке достоверности и отображении сообщений об ошибках, но представленных сведений должно быть вполне достаточно для выработки вами способа разработки информативных пользовательских интерфейсов, которые улучшают восприятие.
Перемещение поддерживающего кода в базовый класс
Вероятно, вы заметили, что в настоящий момент в классе
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
}
Переместите в новый базовый класс весь код, относящийся к
INofityDataErrorInfo
, из файла
CarPartial.cs
. Любые закрытые методы понадобится сделать защищенными. Удалите реализацию интерфейса
INotifyDataErrorInfo
из класса в файле
CarPartial.cs
и добавьте
BaseEntity
в качестве базового класса:
public partial class Car : BaseEntity, IDataErrorInfo
{
// Для краткости код не показан.
}
Теперь любые создаваемые классы моделей будут наследовать весь связующий код
INotifyDataErrorInfo
.
Использование аннотаций данных в WPF
Для проверки достоверности в пользовательских интерфейсах инфраструктура WPF способна также задействовать аннотации данных. Давайте добавим несколько аннотаций данных к модели
Car
.
Добавление аннотаций данных к модели
Откройте файл
Car.cs
и поместите в него оператор
using
для пространства имен
System.ComponentModel.DataAnnotations
. Добавьте к свойствам
Make
,
Color
и
PetName
атрибуты
[Required]
и
[StringLength(50)]
. Атрибут
[Required]
определяет правило проверки достоверности, которое регламентирует, что значение свойства не должно быть
null
(надо сказать, оно избыточно для свойства
Id
, т.к. свойство не относится к типу
int
, допускающему
null
). Атрибут
[StringLength(50)]
определяет правило проверки достоверности, которое ограничивает длину значения свойства 50 символами.