2010-01-15 65 views
2

我正試圖找到一種優雅的方式來驗證WPF中的兩個相關的TextBox值。驗證WPF中的幾個鏈接的數據綁定文本框值

每個文本框的Text屬性都綁定到我的類上的公共小數屬性,該類實現了TwoWay綁定的INotifyPropertyChanged。

我要驗證的兩個值,使得:BiggerValue> = SmallerValue> = 0

我已經成功地得到各值以針對這些條件下,使用IDataErrorInfo的和字符串索引獨立地驗證。

我的問題如下:用戶打算減少這兩個值並以BiggerValue開頭,所以現在它小於SmallerValue。 BiggerValue TextBox上的驗證失敗(儘管該值已存儲)。然後用戶轉到SmallerValue並將其設置爲小於新的BiggerValue。現在這兩個值都是有效的,但我怎樣才能得到BiggerValue文本框自動反映它的(不變)值現在是有效的?

我應該在文本框中查看像LostFocus()這樣的事件處理程序,或者向屬性設置程序添加類似以下內容來強制刷新?

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

我的完整代碼如下。不知何故,這一切都讓人覺得這個簡單的問題很笨拙並且過於複雜。作爲WPF新手(這是第2天),對於我的方法的任何評論,無論激進,都會受到感謝。

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 2015-12-15 12:15:52

回答

1

好,一個簡單的hackish方法是火的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

感謝您的回覆,並且快速回復 - 這是一個不錯的簡單解決方案。我也會查看自定義驗證規則。 – 2010-01-15 18:55:16

+0

如何使用自定義驗證規則有所幫助?看起來這將是與IDataErrorInfo相同的問題。 – HappyNomad 2010-12-02 21:16:48