Валидация данных
Data Validation
Silverlight поддерживает элементарную валидацию данных в режиме связывания TwoWay в направлении потока данных от-приемника-к-источнику. Также Silverlight поддерживает проверку данных с IDataErrorInfo и INotifyDataErrorInfo в любом режиме связывания.
Silverlight уведомляет об ошибке проверки данных всегда, когда присоединяемое свойство (attached property) Validation.Errors связывания содержит ошибки. Ошибки попадают в данную коллекцию в следующих случаях:
• Выброшено исключение из конвертера типов механизма связывания.
• Выброшено исключение из аксессора set объекта связыания.
• Выброшено исключение из атрибута валидации, который был применен к объекту данных или члену.
• Объект связывания реализует интерфейс IDataErrorInfo и его свойство Item возвращает значение отличное от null или Empty.
• Объект связывания реализует интерфейс INotifyDataErrorInfo и его метод GetErrors возвращает значение отличное от null. Возвращаемое методом GetErrors значение может изменяться, т.к. является результатом завершения асинхронных операций валидации.
Silverlight выбрасывает визуальное оповещение об ошибках валидации в следущих случаях:
• Свойство ValidatesOnException выставлено в true.
• Свойство ValidatesOnDataErrors выставлено в true. В любом случае свойство ValidatedOnDataErrors игнорируется для свойства источника, если значение свойства ValidatesOnExceptions есть true и сеттер свойства источника выбрасывает исключение.
• Свойство ValidatesOnNotifyDataErrors выставлено в true. Это свойство может быть задействовано в комбинации с ValidatesOnExceptions либо с ValidatesOnDataErrors.
Визуальное оповещение указывает на контрол содержащий ошибку, и рядом отображается сообщение об ошибке, как показано на следующей иллюстрации:

Вы можете настроить визуальное оповещение контрола путем модификации или замены стандартного ControlTemplate. Подробности смотрите в разделе Control Customization.
Чтобы получать оповещения об ошибках валидации, вы также должны задать свойству объекту связывания NotifyOnValidationError значение true. Задавая ValidatesOnExceptions значение true вы сообщаете механизму связывания, что нужно создать ошибку валидации, когда случается исключение. Задав в NotifyOnValidationError значение true вы сообщаете механизму связывания, что нужно возбуждать событие BindingValidationError, когда случается ошибка валидации. Например, вы можете обрабатывать данное событие ошибки для записи в лог или отображать дополнительное визуальное оповещение.
Чтобы обрабатывать событие BindingValidationError создайте обработчик события в объекте-приемнике или в одном из его родительских объектов. BindingValidationError – это маршрутизируемое событие, поэтому если вы не перехватите его в элементе, который его породил, оно продолжит движение вверх по иерархии объектов, пока не будет перехвачено. Дополнительную информацию о маршрутизируемых событиях смотрите в разделе Events Overview for Silverligh.
В следующем примере показано, как обеспечить свою валидацию связывания.
Связывание создается в XAML.
<StackPanel BindingValidationError="StackPanel_BindingValidationError" >
<StackPanel.Resources>
<my:Bills x:Name="MyBills"/>
</StackPanel.Resources>
<TextBox x:Name="MyTextBox" Width="50" Margin="10">
<TextBox.Text>
<Binding Mode="TwoWay" Source="{StaticResource MyBills}"
Path="Amount" NotifyOnValidationError="true"
ValidatesOnExceptions="true"/>
</TextBox.Text>
</TextBox>
<Button Height="50" Width="150" Content="Click To Update Source"/>
</StackPanel>
Объект-источник выбрасывает исключение, если присваиваемое значение меньше нуля.
public class Bills
{
private double _Amount;
public double Amount
{
get { return _Amount; }
set
{
if (value < 0)
throw new Exception("Amount must be greater than zero.");
_Amount = value;
}
}
}
Контрол StackPanel реализует обработчик события BindingValidationError.
private void StackPanel_BindingValidationError(object sender,
ValidationErrorEventArgs e)
{
if (e.Action == ValidationErrorEventAction.Added)
{
MyTextBox.Background = new SolidColorBrush(Colors.Red);
}
else if (e.Action == ValidationErrorEventAction.Removed)
{
MyTextBox.Background = new SolidColorBrush(Colors.White);
}
}
Просмотреть данный пример
Запустите пример и введите символы вместо числа, чтобы спровоцировать ошибку конвертирования типов. Затем введите отрицательное число, чтобы спровоцировать ошибку в set-акссессоре в объекте-источнике. Теперь введите положительное число, чтобы ушла ошибка валидации. Обновление данных в направлении от-приемника-к-источнику произойдет только когда элемент TextBox потеряет фокус. Нажатие кнопки как раз снимет фокус с TextBox. Если хотите, можете обновлять источник вручную по событию кнопки Click, как уже описывалось ранее в разделе «Обновление данных источника».
Более подробную информацию об использовании атрибутов валидации, определяющих допустимые значения свойств или объектов вы найдете в разделе Using Data Annotations to Customize Data Classes. Дополнительную информацию о предоставлении более детальных отчетов валидации смотрите в обзоре класса ValidationSummary.