Вероятно, вы заметили, что в настоящий момент в классе
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>
информацией о возникших ошибках. Полный код выглядит так:
protected string[] GetErrorsFromAnnotations<T>(
string propertyName, T value)
{
var results = new List<ValidationResult>;
var vc = new ValidationContext(this, null, null)
{ MemberName = propertyName };
var isValid = Validator.TryValidateProperty(
value, vc, results);
return (isValid)
? null
: Array.ConvertAll(
results.ToArray, o => o.ErrorMessage);
}
Теперь можете модифицировать метод индексатора в файле
CarPartial.cs
, чтобы проверять наличие любых ошибок, основанных на аннотациях данных. Обнаруженные ошибки должны добавляться в коллекцию ошибок, поддерживаемую интерфейсом
INotifyDataErrorInfo
. Это позволяет привести в порядок обработку ошибок. В начале индексаторного метода очистите ошибки для столбца. Затем обработайте результаты проверок достоверности и в заключение предоставьте специальную логику для сущности. Ниже показан обновленный код индексатора: