如果已经提出这个问题,请道歉,但我无法找到我的具体问题的答案。
我有一个WPF datagrid
,它绑定到一个名为Waypoint
的对象集合,它实现了IDataErrorInfo
。每个Waypoint
对象都有一组DataItem
的属性,这些属性也会实现IDataErrorInfo
。
datagrid中的每一列都绑定到DataItem
对象的Value属性,我想要的是Waypoint
对象绑定到行验证模板和{{1}绑定到Cell Validator的对象。
我有DataItem
如下:
RowValidationRule
我已经部分工作了,但行验证仅在我离开行时显示,如果行有错误则更令人沮丧,那么验证规则不会在任何后续行上执行,这不是我的想。我已经尝试查看datagrid引用中的代码,看看我是否可以在<DataGrid.RowValidationRules>
<DataErrorValidationRule ValidationStep="UpdatedValue" ValidatesOnTargetUpdated="True"/>
</DataGrid.RowValidationRules>
方法中执行任何覆盖以触发验证规则,但我很难过。
我们已经放入覆盖,以便在网格有任何验证错误时可以编辑单元格。默认情况下,网格不应该是可编辑的,直到任何错误被清除我猜测没有显示多行验证错误是设计的?如果有人对如何绕过这个问题有任何想法,那将非常感谢!!!
答案 0 :(得分:0)
对于第二个问题 -
如果一行有错误会更令人沮丧,那么验证规则就不会在任何后续行上执行,这不是我想要的
如果行有验证错误,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();
}
此解决方案似乎有效,直到现在我还没有遇到任何问题。