Ошибки проверки не позволяют вызывать установщик свойств - PullRequest
4 голосов
/ 11 мая 2010

Я ищу простое решение следующей проблемы:

Я использую простой элемент управления TextBox со свойством Text, связанным со свойством в коде позади.Кроме того, я использую правило проверки для уведомления пользователя о некорректном вводе.

... стиль отображения ошибок здесь ...

Теперь после ввода действительных данных в TextBox пользователь может нажатьКнопка для отправки данных.При нажатии на кнопку оцениваются и отправляются данные из привязанного свойства UserName в приведенном ниже коде.

Проблема заключается в том, что пользователь может ввести действительные данные в TextBox, и это будет установлено в свойстве UserName.Если затем пользователь решает изменить текст в TextBox и данные становятся недействительными, установщик свойства UserName не вызывается после неудачной проверки.

Это означает, что последние действительные данные остаются в свойстве UserName, в то время как TextBox отображает неверные данные с индикатором ошибки.Если пользователь затем нажимает кнопку для отправки данных, вместо текущего содержимого TextBox будут отправлены последние действительные данные.

Я знаю, что могу деактивировать кнопку, если данные недействительны, и фактически я делаю это., но метод вызывается в установщике UserName.И если это не вызывается после неудачной проверки, кнопка остается включенной.

Итак, вопрос: как включить вызов установщика свойств после неудачной проверки?

Ответы [ 2 ]

2 голосов
/ 12 мая 2010

Как я справляюсь с этим в классах моделей моего вида:

public class MyViewModel : INotifyPropertyChanged, IDataErrorInfo
{
   private Dictionary<string, string> _Errors = new Dictionary<string, string>();

   public object SomeProperty
   {
      get { return _SomeProperty; }
      set
      {
         if (value != _SomeProperty && !ValidationError("SomeProperty", value))
            _SomeProperty = value;
            OnPropertyChanged("SomeProperty");
         }
      }
   }

   private bool ValidationError(string propertyName, object value)
   {
      // I usually have a Dictionary<string, Func<object, string>> that maps property
      // names to validation functions; the functions return null if the property
      // is valid and an error message if not.  You can embed the validation logic
      // in the property setters, of course, but breaking them out as separate methods
      // eases testing.
      _Errors[propertyName] = _ValidationMethods[propertyName](value);
      OnPropertyChanged("IsValid");
   }

   public bool IsValid
   {
      get { return !(_Errors.Where(x => x.Value != null).Any()));
   }

   public string this[string propertyName]
   {
      get
      {
         return (_Errors.ContainsKey(propertyName))
            ? _Errors[propertyName]
            : null;
      }
   }
}

Поначалу немного неудобно настраивать все это, но как только вы это сделаете, у вас будет простой и понятный способ сообщать об ошибках валидации в пользовательский интерфейс (через DataErrorValidationRule), простой способ знать, является ли какое-либо данное свойство допустимым или нет (отметьте _Errors), и свойство IsValid, которое сообщает вам, является ли действительной вся модель представления. (Также вы можете расширить свойство IsValid для обработки случая, когда все свойства модели представления являются действительными, но сама модель представления не является допустимой, например, установлены два взаимоисключающих флага.) И до тех пор, пока вы их делаете internal, методы проверки могут быть проверены модулем с помощью NUnit или чего-либо еще.

Я должен добавить, что приведенный выше код не в моей голове и может работать, а может и не работать так, как написано - мой настоящий рабочий код находится в базовом классе и содержит много других вещей, которые просто запутывают .

2 голосов
/ 11 мая 2010

Вы можете установить свойство ValidationRule.ValidationStep для ваших правил проверки на ValidationStep.UpdatedValue. Это сначала обновляет источник, а затем выполняет проверку. Это означает, что ваш установщик свойства должен быть вызван, даже если ваша проверка не пройдена. Обратите внимание, что это свойство доступно только в .NET 3.5 SP1 и выше. Подробнее см. в этом блоге (параграф «Как его использовать? (Часть 1)»).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...