Литмир - Электронная Библиотека
A
A

    <ListBox ItemsSource="{Binding Path=ErrorContent}"/>

  </DataTemplate>

</ListBox.ItemTemplate>

Запустите приложение, выберите автомобиль

Chevy
и установите цвет в
Pink
. В окне отобразятся ошибки (рис. 28.4).

Язык программирования C#9 и платформа .NET5 - _263.png

Мы лишь слегка коснулись поверхности того, что можно делать при проверке достоверности и отображении сообщений об ошибках, но представленных сведений должно быть вполне достаточно для выработки вами способа разработки информативных пользовательских интерфейсов, которые улучшают восприятие.

Перемещение поддерживающего кода в базовый класс

Вероятно, вы заметили, что в настоящий момент в классе

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 символами.

Контроль ошибок проверки достоверности на основе аннотаций данных

В 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>
информацией о возникших ошибках. Полный код выглядит так:

567
{"b":"847442","o":1}