[英]WPF Datagrid Multiple Row Validation
如果已经问过这个问题,我深表歉意,但是我无法找到我的特定问题的答案。
我有一个WPF datagrid
,该datagrid
绑定到实现IDataErrorInfo
名为Waypoint
的对象的集合。 每个Waypoint
对象都有一组具有DataItem
的属性,该属性也实现IDataErrorInfo
。
datagrid中的每一列都绑定到DataItem
对象的Value属性,而我想要的是Waypoint
对象绑定到Row Validation模板,而DataItem
对象绑定到Cell Validator。
我有一个RowValidationRule
,如下所示:
<DataGrid.RowValidationRules>
<DataErrorValidationRule ValidationStep="UpdatedValue" ValidatesOnTargetUpdated="True"/>
</DataGrid.RowValidationRules>
我已经部分地工作了,但是仅当我离开该行时才显示行验证,如果行出错了,则更令人沮丧的是,验证规则不会在随后的任何行上执行,这不是我想要的。 我尝试查看datagrid参考中的代码,以查看是否可以在CommitEdit
方法中进行任何重写来触发验证规则,但是我很困惑。
我们已放入替代项,以便在网格存在任何验证错误时可以编辑单元格。 默认情况下,在清除任何错误之前,网格都不应该是可编辑的,我猜测未显示的多行验证错误是设计使然? 如果有人对我如何解决这个问题有任何想法,将不胜感激!!!
对于第二个问题-
更令人沮丧的是,如果某行有错误,则验证规则不会在任何后续行上执行,这不是我想要的
如果DataGrid发生验证错误,则实际上不会提交该行。 我在Microsoft参考代码的OnExecutedCommitEdit方法中找到了这段代码-
if (validationPassed)
{
CommitRowItem();
}
反过来,这是-
private void CommitRowItem()
{
if (IsEditingRowItem)
{
EditableItems.CommitEdit();
}
else
{
EditableItems.CommitNew();
// Show the placeholder again
UpdateNewItemPlaceholder(/* isAddingNewItem = */ false);
}
}
为了克服这个问题,我扩展了DataGrid来制作自己的自定义DataGrid并覆盖了OnExecutedCommitEdit ,如下所示:
protected override void OnExecutedCommitEdit(ExecutedRoutedEventArgs e)
{
base.OnExecutedCommitEdit(e);
BindingFlags bindingFlags = BindingFlags.FlattenHierarchy | BindingFlags.NonPublic | BindingFlags.Instance;
PropertyInfo editableItems = this.GetType().BaseType.GetProperty("EditableItems", bindingFlags);
((System.ComponentModel.IEditableCollectionView)editableItems.GetValue(this)).CommitEdit();
}
该解决方案似乎有效,到目前为止,我还没有遇到任何问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.