WPF Datagrid:当前一行无效时,无法添加行

问题描述 投票:2回答:1

我有一个视图,其中一些数量(零或更多)的Entity对象从外部(文件,Web服务等)加载。我需要用户能够编辑加载的实体,并在它们全部保存在一个事务中之前添加新行。在加载时,实体通常无效;在准备好持久化之前,它们都需要用户输入。为了实现这一点,视图包含一个WPF DataGrid,其ItemsSource是一个BindingList<Entity>,而我的Entity类实现了IDataErrorInfo,以提供要在网格中的工具提示中显示的每单元错误消息。

当前选定的单元格具有验证错误时,DataGrid的默认行为是禁用编辑所有其他行以及添加新行,直到问题得到解决。这不是我想要的;用户应该能够按照他/她选择的顺序执行使行有效所需的操作。我可以通过继承DataGrid并覆盖OnCanExecuteBeginEdit来使现有行可编辑:

class EditableDataGrid : DataGrid
{
    protected override void OnCanExecuteBeginEdit(CanExecuteRoutedEventArgs e)
    {
        e.CanExecute = true;
        e.Handled = true;
    }
}

这可以根据需要使用,以允许编辑已存在的行。但它仍然无法添加新行。有没有办法覆盖这种行为?或者我是否需要在WPF提供的范围之外创建自定义“验证”处理逻辑,以便在框架方面始终有效,只是为了避免在提供的控件中触发不必要的限制?

更新:此行为似乎也是我间歇性地面对DataGrid的另一个问题的根源。我希望用户能够在此期间保存正在进行的工作并在不同的“批量”实体上工作。在这种情况下,我清除网格为用户创建一个新的平板。但是,如果DataGrid已经决定由于验证错误而不在底部创建新的占位符行,则在清除网格时仍然没有占位符行,并且用户无法继续。我可以尝试为此找到另一个覆盖黑客,但我真的更喜欢修复底层行为(即当前数据“无效”时停止阻止添加/编辑)。

wpf validation datagrid wpfdatagrid
1个回答
0
投票

我有同样的问题,并能够通过覆盖OnExecutedCommitEdit来解决它。在覆盖中,调用基本实现来执行提交。然后,如果编辑单元是单元模式,则还“取消”编辑。如果单元格提交成功,则这将无效。如果它没有成功,这将取消无效输入并允许在其他行上进行编辑并使新行显示为备份。副作用是,如果用户在单元格中输入无效数据,则在提交编辑时它将消失。 IMO这比数据网格“卡住”更好。

    protected override void OnExecutedCommitEdit(ExecutedRoutedEventArgs e)
    {
        base.OnExecutedCommitEdit(e);
        if (e.Parameter is DataGridEditingUnit unit && unit == DataGridEditingUnit.Cell)
        {
            CancelEdit(unit);
        }
    }
© www.soinside.com 2019 - 2024. All rights reserved.