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

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

  {

<b>    ClearErrors(columnName);</b>

<b>    var errorsFromAnnotations =</b>

<b>      GetErrorsFromAnnotations(columnName,</b>

<b>        typeof(Car)</b>

<b>        .GetProperty(columnName)?.GetValue(this,null));</b>

<b>    if (errorsFromAnnotations != null)</b>

<b>    {</b>

<b>      AddErrors(columnName, errorsFromAnnotations);</b>

<b>    }</b>

    switch (columnName)

    {

      case nameof(Id):

        break;

      case nameof(Make):

        CheckMakeAndColor();

        if (Make == &quot;ModelT&quot;)

        {

          AddError(nameof(Make), &quot;Too Old&quot;);

        }

        break;

      case nameof(Color):

        CheckMakeAndColor();

        break;

      case nameof(PetName):

        break;

    }

    return string.Empty;

  }

}

Запустите приложение, выберите один из автомобилей и введите в поле Color текст, содержащий более 50 символов. После превышения порога в 50 символов аннотация данных

StringLength
создает ошибку проверки достоверности, которая сообщается пользователю (рис. 28.5).

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

Настройка свойства 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
. Разметка выглядит следующим образом:

&lt;Window.Resources&gt;

  &lt;Style TargetType=&quot;{x:Type TextBox}&quot;&gt;

    &lt;Style.Triggers&gt;

      &lt;Trigger Property=&quot;Validation.HasError&quot; Value=&quot;true&quot;&gt;

        &lt;Setter Property=&quot;Background&quot; Value=&quot;Pink&quot; /&gt;

        &lt;Setter Property=&quot;Foreground&quot; Value=&quot;Black&quot; /&gt;

        &lt;Setter Property=&quot;ToolTip&quot;

          Value=&quot;{Binding RelativeSource={RelativeSource Self},

          Path=(Validation.Errors)[0].ErrorContent}&quot;/&gt;

      &lt;/Trigger&gt;

    &lt;/Style.Triggers&gt;

  &lt;/Style&gt;

&lt;/Window.Resources&gt;

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