Проверка данных

Для привязки, которая передаёт информацию в источник данных (режимы BindingMode.TwoWay и BindingMode.OneWayToSource) можно выполнить проверку данных перед помещением их в источник. Если данные не проходят проверку, то источник не обновляется.

Первый способ организации проверки заключается в создании и применении проверочных правил. Каждое проверочное правило – это наследник класса System.Windows.Controls.ValidationRule с перекрытым методом Validate(). Этот метод получает проверяемое значение и информацию о культуре, а возвращает объект ValidationResult с результатом проверки. Ниже приведён пример правила для проверки возраста:

public class AgeRule: ValidationRule

{

public double MaxAge { get; set; }

public AgeRule()

{

MaxAge = 100;

}

public override ValidationResult Validate(object value,

CultureInfo culture)

{

double age;

if (!double.TryParse((string) value, out age))

{

return new ValidationResult(false, "Cannot parse");

}

if ((age < 0) || (age > MaxAge))

{

return new ValidationResult(false, "Out of range");

}

return new ValidationResult(true, null);

}

}

Проверочные правила помещают в коллекцию ValidationRules, имеющуюся у каждой привязки:

<!-- изменим предыдущие примеры привязки -->

<TextBox Grid.Column="1" Grid.Row="1">

<TextBox.Text>

<Binding Path="Age" Mode="TwoWay">

<Binding.ValidationRules>

<local:AgeRule MaxAge="120"/>

</Binding.ValidationRules>

</Binding>

</TextBox.Text>

</TextBox>

Второй способ организации проверки основан на генерации исключительной ситуации в методе установки свойства источника данных:

// фрагмент класса Person: определение свойства Age

public double Age

{

get { return _age; }

set

{

if (value < 0)

{

throw new ArgumentException("Age < 0");

}

_age = value;

}

}

Исключительные ситуации, возникающие при передаче информации в источник, отлавливаются при помощи специального встроенного правила ExceptionValidationRule. Вместо использования ExceptionValidationRule можно установить свойство привязки ValidatesOnExceptions в значение true.

Третий способ организации проверки основан на реализации источником данных интерфейса System.ComponentModel.IDataErrorInfo. Интерфейс IDataErrorInfo содержит два элемента: строковое свойство Error и строковый индексатор с ключом-строкой. Свойство Error – это общее описание ошибок объекта. Индексатор принимает имя свойства и возвращает соответствующую детальную информацию об ошибке. Ключевая идея в том, что вся логика обработки ошибок централизована в индексаторе.

Ниже приведён пример класса, реализующего IDataErrorInfo:

public class Person: IDataErrorInfo

{

public string Name { get; set; }

public double Age { get; set; }

public string this[string columnName]

{

get

{

switch (columnName)

{

case "Name":

return string.IsNullOrEmpty(Name)?

"Name cannot be empty": null;

case "Age":

return ((Age < 0) || (Age > 100))?

"Incorrect age": null;

default:

return null;

}

}

}

// это свойство не используется в WPF

public string Error

{

get { return null; }

}

}

Чтобы заставить WPF использовать интерфейс IDataErrorInfo для проверки ошибок при модификации свойства, нужно добавить встроенное правило DataErrorValidationRule в коллекцию ValidationRules. В качестве альтернативы использованию DataErrorValidationRule можно установить свойство привязки ValidatesOnDataErrors в значение true.

При нарушении любого правила проверки выполняются следующие шаги:

1. В целевом объекте присоединённое свойство Validation.HasError устанавливается в true.

2. Создаётся объект ValidationError с информацией об ошибке и добавляется в присоединённую коллекцию Validation.Errors целевого объекта.

3. Если свойство привязки NotifyOnValidationError установлено в true, в целевом объекте инициируется присоединённое событие Validation.Error.

При возникновении ошибки также изменяется визуальное представление целевого элемента управления. Шаблон элемента заменяется шаблоном, определённым в свойстве Validation.ErrorTemplate. Например, в текстовом поле новый шаблон окрашивает контур поля в красный цвет.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: