2013-07-18 7 views
4

Скажите, что я пытаюсь реализовать часть функциональности, в которой текстовое поле позволяет вводить только целые числа пользователем. Я могу реализовать эти два способа, используя ValidationRule, который проверяет, что пользователь вводит и привязывает его к свойству text через XAML, или я могу создать новое поведение и привязать его к элементу управления (а не к привязке).ValidationRule vs Behavior in WPF

Примеры XAML на обоих:

Поведение: <TextBox behaviors:DigitsOnlyBehavior.IsDigitOnly="True"/>

ValidationRule, который связывается с окна Text собственности

<TextBox> 
    <TextBox.Text> 
     <Binding RelativeSource = "{RelativeSource Mode=FindAncestor, AncestorType=Window}" Path="Text" UpdateSourceTrigger="PropertyChanged" Mode="TwoWay"> 
      <Binding.ValidationRules> 
       <utils:RestrictInputTypeValidator Restriction="IntegersOnly" ValidatesOnTargetUpdated="True"/> 
      </Binding.ValidationRules> 
     </Binding> 
    </TextBox.Text> 
</TextBox> 

Каковы преимущества и недостатки этих подходов? Когда я должен их использовать? Или это вопрос предпочтения?

+0

Почему вы не используете [WPF Toolkit] (http://wpf.codeplex.com/)? – HichemSeeSharp

ответ

0

С поведением Мне нравится и ожидать «позитивный» сценарий/рабочий процесс без ошибок. В фокусе нет ошибок. Пользователь получает довольно быстро, что, когда они набирают «a» в текстовом поле с численным поведением, которое не принимает его, это числовое текстовое поле, и так оно и работает.

С проверкой фокусировка, похоже, больше на ошибке. Я могу иметь числовой текстовый блок, но я также не принимаю числа за пределами 100, если вы наберете «101», я дам вам знать, что это неприемлемо. Здесь основное внимание уделяется тому, как пользователь вводит недопустимое значение, вызывая ошибку проверки.

Поведение Преимущества:

  • Предупреждение (не позволяют пользователю снимать себя в ногу), введя некорректные данные.
  • Модель остается чистой. TextBox, обязательными даже не попал в сеттер, поскольку поведение мешает ему, следовательно, не XAML не срабатывает обратно с PropertChanges или ValidationErrors и т.д.

Поведение Неудобство:

-Не могли бы ввести в заблуждение, так что если вы ставите логику не принимать «101», нет способа по умолчанию для руководства пользователем.

+0

Я не совсем уверен в том, что оба преимущества поведения перечислены. Насколько я знаю, используя правило проверки, вы также можете предотвратить ввод плохих данных и сохранить модель чистой, «не нажимая сеттер». Я использовал правило проверки несколько раз, и у него есть все необходимые функции. – guilhermecgs

+0

Единственный недостаток, который я вижу в использовании правила проверки: Как вы знаете, в ViewModel, если все поля действительны? Вы можете решить это, используя Validation.Error = «OnFieldValidationError» (но это настраиваемое решение) – guilhermecgs

+0

Если проверка не выполнена, свойство не обновляется. Таким образом, даже с ValidationRules модель остается чистой. –

Смежные вопросы