2012-03-12 54 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