Язык программирования C#9 и платформа .NET5
<ListBox ItemsSource="{Binding Path=ErrorContent}"/></DataTemplate></ListBox.ItemTemplate>Запустите приложение, выберите автомобиль
и установите цвет вChevy. В окне отобразятся ошибки (рис. 28.4).PinkМы лишь слегка коснулись поверхности того, что можно делать при проверке достоверности и отображении сообщений об ошибках, но представленных сведений должно быть вполне достаточно для выработки вами способа разработки информативных пользовательских интерфейсов, которые улучшают восприятие.
Перемещение поддерживающего кода в базовый класс
Вероятно, вы заметили, что в настоящий момент в классе
присутствует много кода. Поскольку в рассматриваемом примере есть только один класс модели, проблемы не возникают. Но по мере появления новых моделей в реальном приложении добавлять весь связующий код в каждый частичный класс для моделей нежелательно. Гораздо эффективнее поместить поддерживающий код в базовый класс, что и будет сделано.CarPartialСоздайте в папке
новый файл класса по имениModels. Добавьте в него операторыBaseEntity.csдля пространств именusingиSystem.Collections. Пометьте класс как открытый и обеспечьте реализацию им интерфейсаSystem.ComponentModel.INotifyDataErrorInforusing 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в качестве базового класса:BaseEntitypublic 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определяет правило проверки достоверности, которое ограничивает длину значения свойства 50 символами.[StringLength(50)]Контроль ошибок проверки достоверности на основе аннотаций данных
В WPF вы должны программно контролировать наличие ошибок проверки достоверности на основе аннотаций данных. Двумя основными классами, отвечающими за проверку достоверности на основе аннотаций данных, являются
иValidationContext. КлассValidatorпредоставляет контекст для контроля за наличием ошибок проверки достоверности. КлассValidationContextпозволяет проверять, есть ли в объекте ошибки, связанные с аннотациями данных, вValidator.ValidationContextОткройте файл
и добавьте в него следующие операторыBaseEntity.cs:usingusing System.ComponentModel;using System.ComponentModel.DataAnnotations;Далее создайте новый метод по имени
. Это обобщенный метод, который принимает в качестве параметров строковое имя свойства и значение типаGetErrorsFromAnnotations(), а возвращает строковый массив. Он должен быть помечен какТ. Вот его сигнатура:protectedprotected string[] GetErrorsFromAnnotations<T>(string propertyName, T value){}Внутри метода
создайте переменную типаGetErrorsFromAnnotations(), которая будет хранить результаты выполненных проверок достоверности, и объектList<ValidationResult>с областью действия, ограниченной именем переданного методу свойства. Затем вызовите методValidationContext, который возвращает значениеValidate.TryValidateProperty(). Если все проверки (на основе аннотаций данных) прошли успешно, тогда метод возвращаетbool. В противном случае он возвратитtrueи наполнитfalseинформацией о возникших ошибках. Полный код выглядит так:List<ValidationResult>
