2012-03-12 27 views
0

我遇到從代碼隱藏執行驗證的問題。我的數據顯示在一個數據網格中。其中一列(類型)是一個下拉菜單,當下拉菜單被改變時,它觸發一個DropDownClosed事件,它在後面的代碼中處理。INotifyDataErrorInfo不會引發錯誤在代碼後面更改

我想實現的是驗證下列的內容以匹配下拉菜單中新選擇的類型。如果它不匹配,我想要在網格上顯示驗證錯誤。我使用INotifyDataErrorInfo接口實現了我的驗證,除非在後面的代碼中使用它,否則它工作得非常好。當後面的代碼調用驗證時,數據網格的ValidationSummary永遠不會更新。我在這裏做錯了嗎?在使用調試器,我可以清楚地看到正在向dictionnary接口的錯誤的錯誤...

這裏是處理:

 private void TypeBoxChanged(object sender, EventArgs e) 
     { 
     ComboBox box = (sender as ComboBox); 
     IncomingPolicy row = (IncomingPolicy)box.DataContext; 

     string ruleTypeValue = TypeList.GetKeyForText(box.SelectedItem.ToString()); 
     //check if the type is the same 
     if(row.TypeWrapper == ruleTypeValue) 
      return; 
     if (row.ValidateRule(ruleTypeValue)) 
     { 
      //SAVE the record 
     } 
     else 
     { 
      row.RaiseErrorsChanged("RuleWrapper"); 
     } 
    } 

的驗證規則的方法將根據ruletypevalue調用此方法

 public bool ValidateRegularExpression(string property, string value, string expression, string errorMessage) 
     { 
     bool isValid = true; 
     Regex regex = new Regex(expression); 
     Match match = regex.Match(value); 
     if (match.Success) 
     { 
      RemoveError(property, errorMessage);     
     } 
     else 
     { 
      AddError(property, errorMessage, false); 
      isValid = false; 
     } 

     return isValid; 
    } 

我也跟着在MSDN上http://msdn.microsoft.com/en-us/library/system.componentmodel.inotifydataerrorinfo%28VS.95%29.aspx

+1

我想你應該總是調用RemoveError,不管驗證是否成功。或者嘗試將調用添加到'RaiseErrorsChanged(property)'到方法的末尾。 – vorrtex 2012-03-12 19:10:48

+0

如果問題僅與ValidationSummary控件(而不是紅色邊框)有關,請嘗試將'NotifyOnValidationError = True'添加到應該驗證的綁定。 – vorrtex 2012-03-12 19:15:08

+0

@vorrtex我錯過了RaiseErrorChanged,如果你讓它成爲我將標記它的答案。 thx – Stainedart 2012-03-13 11:57:26

回答

3

樣品實施一段時間前,我已經實現了驗證^ h elpers並創造了兩個接口IDataErrorInfoINotifyDataErrorInfo樣品溶液:

http://vortexwolf.wordpress.com/2011/10/01/wpf-validation-with-idataerrorinfo/

Source code

主要實現是在這裏:

this.PropertyChanged += (s, e) => 
{ 
    // if the changed property is one of the properties which require validation 
    if (this._validator.PropertyNames.Contains(e.PropertyName)) 
    { 
     this._validator.ValidateProperty(e.PropertyName); 
     OnErrorsChanged(e.PropertyName); 
    } 
} 

你應該總是調用OnErrorsChanged(或RaiseErrorsChanged你的情況)方法,無論驗證成功:如果屬性無效 - 紅色邊框將是di展開,如果有效 - 綁定控件將返回到其正常狀態。

+0

我正在嘗試你的代碼。試圖用MVVM來實現它。希望它運作良好。感謝您的開始。 – 2013-03-06 09:48:14