2010-01-12 59 views
4

我在屏幕上有兩個文本框,一個是'從數量'另一個'數額'。驗證規則是 '金額'應小於'金額'。WPF驗證問題:如何使用涉及2個字段的驗證工作

現在我的問題是,當用戶輸入'金額'大於'金額'的一對金額時, 如何使兩個文本框顯示爲紅色邊框。當用戶通過「從量」減少或增加「達」校正量(或者 ,如何使兩者的文本框中顯示不 錯誤的外觀?

感謝

我的代碼看起來是這樣的:

public partial class Rate : IDataErrorInfo 
{ 
    public Rate() 
    { 
     is_active = true; 
     registered = DateTime.Now; 
    } 

    #region FOR validation 

    public string Error 
    { 
     get 
     { 
      var properties = this.GetType().GetProperties(); 
      foreach (var propertyInfo in properties) 
      { 
       string err = this[propertyInfo.Name]; 
       if (!string.IsNullOrEmpty(err)) 
       { 
        return err; 
       } 
      } 
      return string.Empty; 
     } 
    } 

    public string this[string propertyName] 
    { 
     get 
     { 
      string result = null; 

      if (result == null && "from_amt" == propertyName) 
      { 
       if (from_amt > to_amt) 
       { 
        result = Resources.Validation.Rate_from_amount_value; 
       } 
      } 

      if (result == null && "to_amt" == propertyName) 
      { 
       if (from_amt > to_amt) 
       { 
        result = Resources.Validation.Rate_to_amount_value; 
       } 
      } 

      return result; 
     } 
    } 
    #endregion 


} 

}

+0

的[使用來自另一控制值驗證規則]可能的複製(http://stackoverflow.com/questions/18554019/validation-rules-using-value-from-another-control) – Dzyann 2015-12-15 12:36:14

回答

1

當我驗證依賴,而不是強調對另一個文本框的值,一個文本框,就像你提到我攔截值變化並接受或拒絕更改。

我發現如果我嘗試根據對文本框的更改來更改文本框B我總是遇到問題,但是如果我接受或拒絕對文本框B的更改(基於文本框B中的值),它可以正常工作。

編輯:

我假設你正在處理的純數字文本框。如果是這種情況,我建議你做我所做的事情。首先,對於我的驗證規則,我創建了一個表示數字約束的多邊形,這使您可以在兩個值之間建立線性關係。然後,無論何時更改一個值,我都會檢查當前數據點是否與驗證多邊形相交。如果數據點位於多邊形之外,則不允許進行更改。

您遇到的問題是,如果您處於多邊形的邊緣,則該值似乎「卡住」。爲了解決這個問題,我創建了一個圖形,用它顯示當前點的驗證多邊形。這樣,如果用戶將一個值推到極限,他們可以明白爲什麼他們不能再改變。

爲了更好的衡量,我沿着繪圖的每個軸添加了滑動條,以便它們可以輕鬆更改值,並且我已經添加了拖動功能。

通過這種方式,您可以獲得穩定的驗證,並且用戶非常清楚如何更改這些值以及爲什麼他們不能超出某些限制。

+0

由於埃裏克爲你的答案。我的客戶希望垃圾更寬容的選擇,以便她可以調整from_amt和to_amt。繼續使用WPF提供的驗證架構將會很好。 – 2010-01-14 05:15:20

+0

在上面的評論中增加了更多內容。 – Eric 2010-01-15 00:18:15

0

查看與其接受的答案類似的SO問題。基本上,解決方案可能是爲每個屬性的設置者的兩個屬性引發屬性更改通知,以便在更改任何屬性時重新驗證它們。

Validate control manually in WPF

+0

我試圖在OnPropertyChange處理程序中引發屬性更改通知,因爲這樣:當更改的字段是「from_amt」時,引發「to_amt」,此類工作。 但是當我在「to_amt」改變時增加了一段代碼來提高「from_amt」時,我得到了堆棧溢出異常。 – 2010-01-14 05:04:24

+0

顯示from_amt'和'to_amt'的'set'訪問器的代碼並顯示異常的詳細信息。 – 2010-01-14 22:09:21