C# WPF Datagrid多行验证

C# WPF Datagrid多行验证,c#,wpf,validation,xaml,datagrid,C#,Wpf,Validation,Xaml,Datagrid,如果已经有人问过这个问题,我表示歉意,但我无法找到我的具体问题的答案 我有一个WPFdatagrid,它绑定到一个名为Waypoint的对象集合,该对象实现了IDataErrorInfo。每个航路点对象都有一组属性,这些属性具有数据项,也实现了IDataErrorInfo datagrid中的每一列都绑定到数据项对象的Value属性,我想要的是航路点对象绑定到行验证模板,而数据项对象绑定到单元格验证器 我有一个行验证规则,如下所示: <DataGrid.RowValidationRules

如果已经有人问过这个问题,我表示歉意,但我无法找到我的具体问题的答案

我有一个WPF
datagrid
,它绑定到一个名为
Waypoint
的对象集合,该对象实现了
IDataErrorInfo
。每个
航路点
对象都有一组属性,这些属性具有
数据项
,也实现了
IDataErrorInfo

datagrid中的每一列都绑定到
数据项
对象的Value属性,我想要的是
航路点
对象绑定到行验证模板,而
数据项
对象绑定到单元格验证器

我有一个
行验证规则
,如下所示:

<DataGrid.RowValidationRules>
    <DataErrorValidationRule ValidationStep="UpdatedValue" ValidatesOnTargetUpdated="True"/>
</DataGrid.RowValidationRules>

我已经让这部分工作,但行验证只在我离开行时显示,更令人沮丧的是,如果一行有错误,那么验证规则不会在任何后续行上执行,这不是我想要的。我尝试查看datagrid引用中的代码,看看是否可以在
committedit
方法中进行任何重写来触发验证规则,但我被难住了


我们加入了覆盖,以便在网格出现任何验证错误时可以编辑单元格。默认情况下,在清除任何错误之前,网格都不应该是可编辑的。我猜不显示多行验证错误是出于设计?如果有人对我如何度过这一关有任何想法,我将不胜感激

第二个问题-

更令人沮丧的是,如果一行有错误,那么验证规则不会在任何后续行上执行,这不是我想要的

如果数据网格有验证错误,它实际上不会提交该行。我在Microsoft参考代码的onexecutedcommittedit方法中找到了这段代码-

if (validationPassed)
{
    CommitRowItem();
}
这又是什么呢-

private void CommitRowItem()
{
    if (IsEditingRowItem)
    {
        EditableItems.CommitEdit();
    }
    else
    {
        EditableItems.CommitNew();

        // Show the placeholder again
        UpdateNewItemPlaceholder(/* isAddingNewItem = */ false);
    }
}
为了克服这个问题,我扩展了DataGrid以创建自己的自定义DataGrid,并对OnexecutedCommittedIt进行了重写,如下所示-

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

这个解决方案似乎有效,到目前为止我还没有遇到任何问题。

一般来说,我建议不要直接在datagrid中编辑。拾取行,在覆盖中编辑。您会发现各种各样的问题,例如,如果需要某个属性,该怎么办。用户只需单击另一行就可以忽略失败。我很少使用行验证。我的理解是,一旦你编辑完一行,它就会生效。我想我的结论是,结果太晚了,没有用。