Читайте также:
|
|
Для привязки, которая передаёт информацию в источник данных (режимы 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. Например, в текстовом поле новый шаблон окрашивает контур поля в красный цвет.
Дата добавления: 2015-11-14; просмотров: 35 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Конвертеры значений | | | Трансформации |