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).
Настройка свойства 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
. Разметка выглядит следующим образом:
Value="{Binding RelativeSource={RelativeSource Self},
Path=(Validation.Errors)[0].ErrorContent}"/>
Бьерн Страуструп , Бьёрн Страуструп , Валерий Федорович Альмухаметов , Ирина Сергеевна Козлова
Программирование, программы, базы данных / Базы данных / Программирование / Учебная и научная литература / Образование и наука / Книги по IT