我正在经历从代码隐藏中发布的执行验证。我的数据显示在数据网格中。其中一列(类型)是下拉列表,当下拉菜单更改时,它会触发DropDownClosed事件,该事件在后面的代码中处理。
我想要实现的是验证以下列的内容以匹配下拉列表中新选择的类型。如果它不匹配,我想在网格上显示验证错误。我使用INotifyDataErrorInfo接口实现了我的验证,除非我在后面的代码中使用它,否则它的效果非常好。当后面的代码调用验证时,数据网格的ValidationSummary永远不会更新。我在这做错了什么???使用调试器时,我可以清楚地看到错误被添加到界面的错误字典中......
这是处理程序:
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
答案 0 :(得分:3)
早些时候,我已经实现了验证助手,并为接口IDataErrorInfo
和INotifyDataErrorInfo
创建了示例解决方案:
http://vortexwolf.wordpress.com/2011/10/01/wpf-validation-with-idataerrorinfo/
主要实现在这里:
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
)方法:如果属性无效 - 将显示红色边框,如果有效 - 绑定控件将返回正常状态。