Читаем Язык программирования C#9 и платформа .NET5 полностью

using System.ComponentModel.DataAnnotations;

Далее создайте новый метод по имени GetErrorsFromAnnotations. Это обобщенный метод, который принимает в качестве параметров строковое имя свойства и значение типа Т, а возвращает строковый массив. Он должен быть помечен как protected. Вот его сигнатура:

protected string[] GetErrorsFromAnnotations(

  string propertyName, T value)

{}

Внутри метода GetErrorsFromAnnotations создайте переменную типа List, которая будет хранить результаты выполненных проверок достоверности, и объект ValidationContext с областью действия, ограниченной именем переданного методу свойства. Затем вызовите метод Validate.TryValidateProperty, который возвращает значение bool. Если все проверки (на основе аннотаций данных) прошли успешно, тогда метод возвращает true. В противном случае он возвратит false и наполнит List информацией о возникших ошибках. Полный код выглядит так:

protected string[] GetErrorsFromAnnotations(

  string propertyName, T value)

{

  var results = new List;

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

<p id="AutBody_Root1284"><strong>Настройка свойства ErrorTemplate</strong></p>

Финальной темой является создание стиля, который будет применяться, когда элемент управления содержит ошибку, а также обновление 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. Разметка выглядит следующим образом:

 

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

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

97 этюдов для архитекторов программных систем
97 этюдов для архитекторов программных систем

Успешная карьера архитектора программного обеспечения требует хорошего владения как технической, так и деловой сторонами вопросов, связанных с проектированием архитектуры. В этой необычной книге ведущие архитекторы ПО со всего света обсуждают важные принципы разработки, выходящие далеко за пределы чисто технических вопросов.?Архитектор ПО выполняет роль посредника между командой разработчиков и бизнес-руководством компании, поэтому чтобы добиться успеха в этой профессии, необходимо не только овладеть различными технологиями, но и обеспечить работу над проектом в соответствии с бизнес-целями. В книге более 50 архитекторов рассказывают о том, что считают самым важным в своей работе, дают советы, как организовать общение с другими участниками проекта, как снизить сложность архитектуры, как оказывать поддержку разработчикам. Они щедро делятся множеством полезных идей и приемов, которые вынесли из своего многолетнего опыта. Авторы надеются, что книга станет источником вдохновения и руководством к действию для многих профессиональных программистов.

Билл де Ора , Майкл Хайгард , Нил Форд

Программирование, программы, базы данных / Базы данных / Программирование / Книги по IT
Программирование. Принципы и практика использования C++ Исправленное издание
Программирование. Принципы и практика использования C++ Исправленное издание

Специальное издание самой читаемой и содержащей наиболее достоверные сведения книги по C++. Книга написана Бьярне Страуструпом — автором языка программирования C++ — и является каноническим изложением возможностей этого языка. Помимо подробного описания собственно языка, на страницах книги вы найдете доказавшие свою эффективность подходы к решению разнообразных задач проектирования и программирования. Многочисленные примеры демонстрируют как хороший стиль программирования на С-совместимом ядре C++, так и современный -ориентированный подход к созданию программных продуктов. Третье издание бестселлера было существенно переработано автором. Результатом этой переработки стала большая доступность книги для новичков. В то же время, текст обогатился сведениями и методиками программирования, которые могут оказаться полезными даже для многоопытных специалистов по C++. Не обойдены вниманием и нововведения языка: стандартная библиотека шаблонов (STL), пространства имен (namespaces), механизм идентификации типов во время выполнения (RTTI), явные приведения типов (cast-операторы) и другие. Настоящее специальное издание отличается от третьего добавлением двух новых приложений (посвященных локализации и безопасной обработке исключений средствами стандартной библиотеки), довольно многочисленными уточнениями в остальном тексте, а также исправлением множества опечаток. Книга адресована программистам, использующим в своей повседневной работе C++. Она также будет полезна преподавателям, студентам и всем, кто хочет ознакомиться с описанием языка «из первых рук».

Бьерн Страуструп , Бьёрн Страуструп , Валерий Федорович Альмухаметов , Ирина Сергеевна Козлова

Программирование, программы, базы данных / Базы данных / Программирование / Учебная и научная литература / Образование и наука / Книги по IT