Чтение онлайн

ЖАНРЫ

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

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

В 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
) указывает на элемент управления, к которому применяется данный стиль, в этом случае
TextBox
. Путь (
Path
) представляет собой первое значение
ErrorContent
в коллекции
Validation.Errors
. Разметка выглядит следующим образом:

<Window.Resources>

<Style TargetType="{x:Type TextBox}">

<Style.Triggers>

<Trigger Property="Validation.HasError" Value="true">

<Setter Property="Background" Value="Pink" />

<Setter Property="Foreground" Value="Black" />

<Setter Property="ToolTip"

Value="{Binding RelativeSource={RelativeSource Self},

Path=(Validation.Errors)[0].ErrorContent}"/>

</Trigger>

</Style.Triggers>

</Style>

</Window.Resources>

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

Определенный выше стиль изменяет внешний вид любого элемента управления

TextBox
, который содержит ошибку. Далее мы создадим специальный шаблон элемента управления с целью обновления свойства
ErrorTemplate
класса
Validation
, чтобы отобразить восклицательный знак красного цвета и установить всплывающие подсказки для восклицательного знака. Шаблон
ErrorTemplate
является декоратором, который располагается поверх элемента управления. Хотя только что созданный стиль обновляет сам элемент управления, шаблон
ErrorTemplate
будет размещаться поверх элемента управления.

Поделиться с друзьями: