<ListBox ItemsSource="{Binding Path=ErrorContent}"/>
</DataTemplate>
</ListBox.ItemTemplate>
Запустите приложение, выберите автомобиль 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
}
Переместите в новый базовый класс весь код, относящийся к INofityDataErrorInfo, из файла CarPartial.cs. Любые закрытые методы понадобится сделать защищенными. Удалите реализацию интерфейса INotifyDataErrorInfo из класса в файле CarPartial.cs и добавьте BaseEntity в качестве базового класса:
public partial class Car : BaseEntity, IDataErrorInfo
{
// Для краткости код не показан.
}
Теперь любые создаваемые классы моделей будут наследовать весь связующий код INotifyDataErrorInfo.
Использование аннотаций данных в WPF
Для проверки достоверности в пользовательских интерфейсах инфраструктура WPF способна также задействовать аннотации данных. Давайте добавим несколько аннотаций данных к модели Car.
(window.adrunTag = window.adrunTag || []).push({v: 1, el: 'adrun-4-390', c: 4, b: 390})
Добавление аннотаций данных к модели
Откройте файл Car.cs и поместите в него оператор using для пространства имен System.ComponentModel.DataAnnotations. Добавьте к свойствам Make, Color и PetName атрибуты [Required] и [StringLength(50)]. Атрибут [Required] определяет правило проверки достоверности, которое регламентирует, что значение свойства не должно быть null (надо сказать, оно избыточно для свойства Id, т.к. свойство не относится к типу int, допускающему null). Атрибут [StringLength(50)] определяет правило проверки достоверности, которое ограничивает длину значения свойства 50 символами.
Контроль ошибок проверки достоверности на основе аннотаций данных
В WPF вы должны программно контролировать наличие ошибок проверки достоверности на основе аннотаций данных. Двумя основными классами, отвечающими за проверку достоверности на основе аннотаций данных, являются ValidationContext и Validator. Класс ValidationContext предоставляет контекст для контроля за наличием ошибок проверки достоверности. Класс Validator позволяет проверять, есть ли в объекте ошибки, связанные с аннотациями данных, в ValidationContext.
Откройте файл BaseEntity.cs и добавьте в него следующие операторы using:
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
Далее создайте новый метод по имени GetErrorsFromAnnotations(). Это обобщенный метод, который принимает в качестве параметров строковое имя свойства и значение типа Т, а возвращает строковый массив. Он должен быть помечен как protected. Вот его сигнатура:
protected string[] GetErrorsFromAnnotations<T>(
string propertyName, T value)
{}
Внутри метода GetErrorsFromAnnotations() создайте переменную типа List<ValidationResult>, которая будет хранить результаты выполненных проверок достоверности, и объект ValidationContext с областью действия, ограниченной именем переданного методу свойства. Затем вызовите метод Validate.TryValidateProperty(), который возвращает значение bool. Если все проверки (на основе аннотаций данных) прошли успешно, тогда метод возвращает true. В противном случае он возвратит false и наполнит List<ValidationResult> информацией о возникших ошибках. Полный код выглядит так: