2010-01-15 2 views
2

Я пытаюсь найти элегантный способ проверки двух связанных значений TextBox в WPF.Проверка нескольких связанных значений привязки значений TextBox в WPF

Свойство Text каждого текстового поля привязано к общедоступному десятичному свойству в моем классе, который реализует привязку INotifyPropertyChanged для TwoWay.

Я хочу, чтобы проверить два значения, такие, что: BiggerValue> = SmallerValue> = 0

Я удалось получить каждое значение для проверки независимо от этих условий, используя IDataErrorInfo и струнный индексатор.

Моя проблема заключается в следующем: пользователь намеревается уменьшить оба значения и начать с BiggerValue, так что теперь он меньше, чем SmallerValue. Проверка на BiggerValue TextBox не выполняется (хотя значение сохраняется). Затем пользователь переходит к SmallerValue и устанавливает его меньше, чем новый BiggerValue. Теперь оба значения действительны снова, но как я могу заставить текстовое поле BiggerValue автоматически отражать, что его (неизмененное) значение теперь действительно?

Должен ли я искать обработчик событий, например LostFocus() в текстовых полях, или добавлять что-то подобное в настройки свойств для принудительного обновления?

biggerValueTextBox.GetBindingExpression(TextBox.TextProperty).UpdateSource(); 
smallerValueTextBox.GetBindingExpression(TextBox.TextProperty).UpdateSource(); 

Полный код приведен ниже. Как-то все это кажется довольно неуклюжим и сложным для этой простой проблемы. Будучи новичком WPF (это второй день), любые комментарии о моем подходе, пусть и радикальные, будут получены с благодарностью.

XAML:

<TextBox x:Name="biggerValueTextBox" 
     Text="{Binding Path=BiggerValue, 
         Mode=TwoWay, 
         ValidatesOnDataErrors=True, 
         ValidatesOnExceptions=True}" /> 
<TextBox x:Name="smallerValueTextBox" 
     Text="{Binding Path=SmallerValue, 
         Mode=TwoWay, 
         ValidatesOnDataErrors=True, 
         ValidatesOnExceptions=True}" /> 

C#:

public partial class MyClass : UserControl, 
    INotifyPropertyChanged, IDataErrorInfo 
{ 
    // properties 
    private decimal biggerValue = 100; 
    public decimal BiggerValue 
    { 
     get 
     { 
      return biggerValue; 
     } 
     set 
     { 
      biggerValue = value; 
      OnPropertyChanged("BiggerValue"); 
     } 
    } 
    private decimal smallerValue = 80; 
    public decimal SmallerValue 
    { 
     get 
     { 
      return smallerValue; 
     } 
     set 
     { 
      smallerValue = value; 
      OnPropertyChanged("SmallerValue"); 
     } 
    } 

    // error handling 
    public string this[string propertyName] 
    { 
     get 
     { 
      if (propertyName == "BiggerValue") 
      { 
       if (BiggerValue < SmallerValue) 
        return "BiggerValue is less than SmallerValue."; 
       if (BiggerValue < 0) 
        return "BiggerValue is less than zero."; 
      } 
      if (propertyName == "SmallerValue") 
      { 
       if (BiggerValue < SmallerValue) 
        return "BiggerValue is less than SmallerValue."; 
       if (SmallerValue < 0) 
        return "SmallerValue is less than zero."; 
      } 
      return null; 
     } 
    } 
    // WPF doesn't use this property. 
    public string Error { get { return null; } } 

    // event handler for data binding 
    public event PropertyChangedEventHandler PropertyChanged; 
    protected void OnPropertyChanged(string propertyName) 
    { 
     if (PropertyChanged != null) 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
    } 
} 
+1

Возможный дубликат [Правила проверки с использованием значения из другого элемента управления] (http://stackoverflow.com/questions/18554019/validation-rules-using-value-from- другой-контроль) – Dzyann

ответ

1

хорошо, легкий хаком метод будет стрелять свойство изменено для biggerValue, а также (это вызовет обновление из проверки для большее значение):

public decimal SmallerValue 
    { 
     get 
     { 
      return smallerValue; 
     } 
     set 
     { 
      bool fireForBigger = smallerValue > biggerValue && smallerValue < value; 
      smallerValue = value; 
      OnPropertyChanged("SmallerValue"); 
      if (fireForBigger) 
      { 
       OnPropertyChanged("BiggerValue"); 
      } 
     } 
    } 

Но более солидным решением было бы создать собственное правило валидации s и установить все это самостоятельно: http://msdn.microsoft.com/en-us/library/system.windows.data.binding.validationrules.aspx

+0

Спасибо за это и за ответ так быстро - это приятное и простое решение. Я также рассмотрю правила пользовательской проверки. –

+0

Как использовать специальные правила проверки? Похоже, это будет та же проблема, что и с IDataErrorInfo. – HappyNomad

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

  • Нет связанных вопросов^_^