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

Комбинирование IDataErrorInfo С INotifyDataErrorInfo для проверки достоверности

В предыдущем разделе было показано, что реализацию интерфейса

IDataErrorInfo
можно добавить к частичному классу, т.е. обновлять блоки
set
не понадобится. Кроме того, индексатор автоматически вызывается при возникновении события
PropertyChanged
в свойстве. Комбинирование
IDataErrorInfo
и
INotifyDataErrorInfo
предоставляет дополнительные возможности для проверки достоверности из
INotifyDataErrorInfo
, а также отделение от блоков
set
, обеспечиваемое
IDataErrorInfo
.

Цель применения

IDataErrorInfo
не в том, чтобы запускать проверку достоверности, а в том, чтобы гарантировать вызов кода проверки, который задействует
INotifyDataErrorInfo
, каждый раз, когда для объекта генерируется событие
PropertyChanged
. Поскольку интерфейс
IDataErrorInfo
не используется для проверки достоверности, необходимо всегда возвращать
string.Empty
из индексатора. Модифицируйте индексатор и вспомогательный метод
CheckMakeAndColor()
следующим образом:

public string this[string columnName]

{

  get

  {

    ClearErrors(columnName);

    switch (columnName)

    {

      case nameof(Id):

        break;

      case nameof(Make):

        CheckMakeAndColor();

        if (Make == "ModelT")

        {

          AddError(nameof(Make), "Too Old");

          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).

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

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

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>

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