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

ЖАНРЫ

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

hasError = true;

}

break;

case nameof(Color):

CheckMakeAndColor;

break;

case nameof(PetName):

break;

}

return string.Empty;

}

}

internal bool CheckMakeAndColor

{

if (Make == "Chevy" && Color == "Pink")

{

AddError(nameof(Make), $"{Make}'s don't come in {Color}");

AddError(nameof(Color),

$"{Make}'s don't come in {Color}");

return true;

}

return false;

}

Запустите

приложение, выберите автомобиль
Chevy
и измените цвет на
Pink
. В дополнение к декораторам красного цвета вокруг текстовых полей Make и Model будет также отображаться декоратор в виде красного прямоугольника, охватывающего целиком всю сетку, в которой находятся поля с детальной информацией об автомобиле (рис. 28.3).

Это еще одно преимущество применения интерфейса

INotifyDataErrorInfo
. В дополнение к элементам управления, которые содержат ошибки, элемент управления, определяющий контекст данных, также декорируется шаблоном отображения ошибки.

Отображение всех ошибок

Свойство

Errors
класса
Validation
возвращает все ошибки проверки достоверности для конкретного объекта в форме объектов
ValidationError
. Каждый объект
ValidationError
имеет свойство
ErrorContent
, которое содержит список сообщений об ошибках для свойства. Это означает, что сообщения об ошибках, которые нужно отобразить, находятся в списке внутри списка. Чтобы вывести их надлежащим образом, понадобится создать элемент
ListBox
, содержащий еще один элемент
ListBox
. Звучит слегка запутанно, но вскоре все прояснится.

Первым делом добавьте одну строку в

DetailsGrid
и удостоверьтесь в том, что значение свойства
Height
элемента
Window
составляет не менее
300
. Поместите в последнюю строку элемент управления
ListBox
и привяжите его свойство
ItemsSource
к
DetailsGrid
, используя
Validation.Errors
для
Path
:

<ListBox Grid.Row="6" Grid.Column="0" Grid.ColumnSpan="2"

ItemsSource="{Binding ElementName=DetailsGrid, Path=(Validation.Errors)}">

</ListBox>

Добавьте к

ListBox
элемент
DataTemplate
, а в него — элемент управления
ListBox
, привязанный к свойству
ErrorContent
. Контекстом данных для каждого элемента
ListBoxItem
в этом случае является объект
ValidationError
, так что устанавливать контекст данных не придется, а только путь. Установите путь привязки в
ErrorContent
:

<ListBox.ItemTemplate>

<DataTemplate>

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

</DataTemplate>

</ListBox.ItemTemplate>

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

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

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

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

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

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

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