在AddNew或EditItem事务期间不允许"DeferRefresh"

yin*_*ang 15 wpf wpfdatagrid

我在GUI中有一个选项卡控件,其中一个选项卡中有WPF 4.0数据网格.当我单击网格中的单元格并编辑某些内容然后切换选项卡时,我收到了延迟刷新错误:

在AddNew或EditItem事务期间不允许使用DeferRefresh'.

因此,datagrid.CancelEdit(DataGridEditingUnit.Row)当切换选项卡以取消任何待处理的编辑并且延迟刷新问题消失时,我会调用.

但我真正想做的是CommitEdit()让用户不必再次重新输入数据.

datagrid.CommitEdit(DataGridEditingUnit.Row, true)没有为我工作.我得到以下错误CommitEnd():

暂停调度程序处理时无法执行此操作.

PS:我已经尝试过datagrid.CommitEdit()和datagrid.CommitEdit(DataGridEditingUnit.Column,true),但它没有用.

Foo*_*ole 10

我通过为DataGrid的Unloaded事件添加此处理程序来解决这个问题:

    void DataGrid_Unloaded(object sender, RoutedEventArgs e)
    {
        var grid = (DataGrid)sender;
        grid.CommitEdit(DataGridEditingUnit.Row, true);
    }
Run Code Online (Sandbox Code Playgroud)

  • 这似乎有效。我正在执行 grid.CommitEdit() 并且没有工作。我想知道为什么这些参数是必要的。谢谢! (2认同)

小智 4

我以前也遇到过这个问题。WPF 仅将当前选项卡的视图保留在内存中;当您切换选项卡时,WPF 会卸载当前视图并加载所选选项卡的视图。但是,如果当前正在执行 AddNew 或 EditItem 事务并且 WPF 尝试卸载它,则 DataGrid 会引发此异常。

我的解决方案是将所有选项卡视图保留在内存中,但仅将当前选项卡的视图设置为可见。此链接显示了执行此操作的方法:

WPF TabControl - 防止选项卡更改时卸载?

此更改还将使您在选项卡之间切换时加载更加顺畅,因为不必重新生成视图。就我而言,额外的内存使用是一个合理的权衡。