Контроль ошибок проверки достоверности на основе аннотаций данных
В 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
. Это позволяет привести в порядок обработку ошибок. В начале индексаторного метода очистите ошибки для столбца. Затем обработайте результаты проверок достоверности и в заключение предоставьте специальную логику для сущности. Ниже показан обновленный код индексатора:
public string this[string columnName]
{
get
{
ClearErrors(columnName);
var errorsFromAnnotations =
GetErrorsFromAnnotations(columnName,
typeof(Car)
.GetProperty(columnName)?.GetValue(this,null));
if (errorsFromAnnotations != null)
{
AddErrors(columnName, errorsFromAnnotations);
}
switch (columnName)
{
case nameof(Id):
break;
case nameof(Make):
CheckMakeAndColor;
if (Make == "ModelT")
{
AddError(nameof(Make), "Too Old");
}
break;
case nameof(Color):
CheckMakeAndColor;
break;
case nameof(PetName):
break;
}
return string.Empty;
}
}
Запустите
приложение, выберите один из автомобилей и введите в поле Color текст, содержащий более 50 символов. После превышения порога в 50 символов аннотация данных
StringLength
создает ошибку проверки достоверности, которая сообщается пользователю (рис. 28.5).
Настройка свойства ErrorTemplate
Финальной темой является создание стиля, который будет применяться, когда элемент управления содержит ошибку, а также обновление
ErrorTemplate
для отображения более осмысленного сообщения об ошибке. Как объяснялось в главе 27, элементы управления допускают настройку посредством стилей и шаблонов элементов управления.
Начните с добавления в раздел
Window.Resources
файла
MainWindow.xaml
нового стиля с целевым типом
TextBox
. Добавьте к стилю триггер, который устанавливает свойства, когда свойство
Validation.HasError
имеет значение
true
. Свойствами и устанавливаемыми значениями являются
Background(Pink)
,
Foreground(Black)
и
ToolTip(ErrorContent)
. В элементах
Setter
для свойств
Background
и
Foreground
нет ничего нового, но синтаксис установки свойства
ToolTip
требует пояснения. Привязка (
Binding
) указывает на элемент управления, к которому применяется данный стиль, в этом случае
Запустите приложение и создайте условие для ошибки. Результат будет подобен тому, что показан на рис. 28.6, и укомплектован всплывающей подсказкой с сообщением об ошибке.
Определенный выше стиль изменяет внешний вид любого элемента управления
TextBox
, который содержит ошибку. Далее мы создадим специальный шаблон элемента управления с целью обновления свойства
ErrorTemplate
класса
Validation
, чтобы отобразить восклицательный знак красного цвета и установить всплывающие подсказки для восклицательного знака. Шаблон
ErrorTemplate
является декоратором, который располагается поверх элемента управления. Хотя только что созданный стиль обновляет сам элемент управления, шаблон