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

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

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

 

   

 

Запустите приложение, выберите автомобиль Chevy и установите цвет в Pink. В окне отобразятся ошибки (рис. 28.4).

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

<p id="AutBody_Root1280"><strong>Перемещение поддерживающего кода в базовый класс</strong></p>

Вероятно, вы заметили, что в настоящий момент в классе 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.

<p id="AutBody_Root1281"><strong>Использование аннотаций данных в WPF</strong></p>

Для проверки достоверности в пользовательских интерфейсах инфраструктура WPF способна также задействовать аннотации данных. Давайте добавим несколько аннотаций данных к модели Car.

<p id="AutBody_Root1282"><strong>Добавление аннотаций данных к модели</strong></p>

Откройте файл Car.cs и поместите в него оператор using для пространства имен System.ComponentModel.DataAnnotations. Добавьте к свойствам Make, Color и PetName атрибуты [Required] и [StringLength(50)]. Атрибут [Required] определяет правило проверки достоверности, которое регламентирует, что значение свойства не должно быть null (надо сказать, оно избыточно для свойства Id, т.к. свойство не относится к типу int, допускающему null). Атрибут [StringLength(50)] определяет правило проверки достоверности, которое ограничивает длину значения свойства 50 символами.

<p id="AutBody_Root1283"><strong>Контроль ошибок проверки достоверности на основе аннотаций данных</strong></p>

В WPF вы должны программно контролировать наличие ошибок проверки достоверности на основе аннотаций данных. Двумя основными классами, отвечающими за проверку достоверности на основе аннотаций данных, являются ValidationContext и Validator. Класс ValidationContext предоставляет контекст для контроля за наличием ошибок проверки достоверности. Класс Validator позволяет проверять, есть ли в объекте ошибки, связанные с аннотациями данных, в ValidationContext.

Откройте файл BaseEntity.cs и добавьте в него следующие операторы using:

using System.ComponentModel;

Перейти на страницу:

Похожие книги