【问题标题】:WPF Datagrid Multiple Row ValidationWPF Datagrid 多行验证
【发布时间】:2018-09-06 02:36:49
【问题描述】:

抱歉,如果这个问题已经被问过,但我无法找到我的具体问题的答案。

我有一个 WPF datagrid,它绑定到一个名为 Waypoint 的对象集合,该集合实现了 IDataErrorInfo。每个Waypoint 对象都有一组具有DataItem 的属性,而IDataErrorInfo 也实现了IDataErrorInfo

datagrid中的每一列都绑定到DataItem对象的Value属性,我想要的是Waypoint对象绑定到行验证模板和DataItem对象绑定到单元格验证器。

我有一个RowValidationRule,如下:

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

我已经部分工作了,但是只有当我离开该行时才会显示行验证,更令人沮丧的是,如果一行有错误,那么验证规则不会在任何后续行上执行,这不是我的想。我尝试查看数据网格参考中的代码,看看是否可以在 CommitEdit 方法中进行任何覆盖以触发验证规则,但我很难过。

我们已经进行了覆盖,以便在网格有任何验证错误时可以编辑单元格。默认情况下,在清除任何错误之前,网格不应该是可编辑的,我猜想不显示多行验证错误是设计使然?如果有人对我如何解决这个问题有任何想法,将不胜感激!!!

【问题讨论】:

  • 一般来说,我建议不要直接在数据网格中进行编辑。选择一行,在叠加层中进行编辑。你会发现各种各样的问题,例如如果需要一个属性怎么办。用户只需单击不同的行并忽略失败。
  • 我很少使用行验证。我的理解是,一旦你完成了一行的编辑,它就会启动。我认为我的结论是,最终为时已晚,无法发挥作用。

标签: c# wpf validation xaml datagrid


【解决方案1】:

对于第二个问题-

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

如果有验证错误,DataGrid 不会实际提交该行。我在微软参考代码的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();
}

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

【讨论】:

    猜你喜欢
    • 2012-12-09
    • 2011-09-29
    • 1970-01-01
    • 1970-01-01
    • 2011-06-29
    • 2011-02-22
    • 2011-05-05
    • 2015-10-15
    • 1970-01-01
    相关资源
    最近更新 更多