繁体   English   中英

WPF Datagrid多行验证

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM