Thursday, October 21, 2010

Silverlight. Основы. Валидация. Часть 2. IDataErrorInfo & INotifyDataErrorInfo

Еще пару слов про ValidatesOnExceptions
Забыл сказать, что если вам хочется построить валидацию на исключениях, то совсем не обязательно использовать DataAnnotations, можно очень просто выбрасывать исключения прям из set методов. Например, для проверки того, что повторно введенный пароль из прошлого примера совпадает с перво-введённым паролем, можно сделать так:
[Display(Name = "New password confirmation")]
public string NewPasswordConfirmation
{
   get { return _newPasswordConfirmation; }
   set
   {
       _newPasswordConfirmation = value;
       OnPropertyChanged("NewPasswordConfirmation");
       ChangePasswordCommand.RaiseCanExecuteChanged();
       if (string.CompareOrdinal(_newPassword, value) != 0)
           throw new Exception("Password confirmation not equal to password.");
   }
}
Так, конечно, выглядит намного проще, чем описывать все на аттрибутах (в случае CustomValidationAttribute).
IDataErrorInfo
IDataErrorInfo интерфейс пришел вместе с Silverlight 4. Он нам поможет избавиться от передачи сообщений об ошибках инфраструктуре Silverlight основанной на бросании исключений. Все, что нужно сделать – это реализовать два описанных в этом интерфейсе метода/свойства. Чаще всего разработчики начинают с того, что добавляют некий класс-обработчик, который хранит коллекцию сообщений об ошибках:
public class ValidationHandler
{
   private Dictionary<string, string> BrokenRules { get; set; }
   public ValidationHandler()
   {
       BrokenRules = new Dictionary<string, string>();
   }
   public string this[string property]
   {
       get { return BrokenRules[property]; }
   }
   public bool BrokenRuleExists(string property)
   {
       return BrokenRules.ContainsKey(property);
   }
Read more: outcoldman