WPF Datagrid多行验证

时间:2018-03-27 15:36:25

标签: c# wpf validation xaml datagrid

如果已经提出这个问题,请道歉,但我无法找到我的具体问题的答案。

我有一个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> 方法中执行任何覆盖以触发验证规则,但我很难过。

我们已经放入覆盖,以便在网格有任何验证错误时可以编辑单元格。默认情况下,网格不应该是可编辑的,直到任何错误被清除我猜测没有显示多行验证错误是设计的?如果有人对如何绕过这个问题有任何想法,那将非常感谢!!!

1 个答案:

答案 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();
}

此解决方案似乎有效,直到现在我还没有遇到任何问题。