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

19

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

  

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

因此,当切换选项卡以取消任何挂起的编辑并解决Defer刷新问题时,我调用datagrid.CancelEdit(DataGridEditingUnit.Row)

但是我真正想做的是CommitEdit(),这样用户就不必重新输入数据了。

datagrid.CommitEdit(DataGridEditingUnit.Row, true)对我无效。在CommitEnd()上我收到以下错误消息:

  

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

附注:我尝试过datagrid.CommitEdit()datagrid.CommitEdit(DataGridEditingUnit.Column, true)都未奏效。


你能展示一下datagrid和event的代码吗? - jamesSampica
在远程桌面上工作时,如果连接在编辑期间关闭(可能只是因为计算机进入睡眠状态,而RDP只是一个误导),会出现相同的错误。通过在SystemEvents.PowerModeChanged响应中进行相同的CommitEdit()调用来修复。确保使用WeakEventManager处理此静态事件,以免泄漏网格,并/或在Unloaded中注销。 - dlf
5个回答

15

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

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

1
这似乎有效。我之前在使用grid.CommitEdit()时不起作用。我想知道为什么需要这些参数。谢谢! - redcurry

4
我之前也遇到过这个问题。WPF只会在内存中保留当前标签页的视图;当你切换标签页时,WPF会卸载当前视图并加载所选标签页的视图。但是,如果DataGrid当前正在执行AddNew或EditItem事务,并且WPF尝试卸载它,则会引发此异常。
对我而言,解决方案是将所有标签页视图都保存在内存中,但仅将当前标签页的视图设置为可见。此链接展示了一种实现方法: WPF TabControl - Preventing Unload on Tab Change? 此更改还会使您在切换标签页时更加流畅,因为视图不必重新生成。在我的情况下,额外的内存使用是一个合理的权衡。

3

在 Xaml 中:

Loaded="OnUserControlLoaded"

Unloaded="OnUserControlUnloaded"

在代码后台的OnUserControlLoadedOnUserControlUnloaded方法中:

dataGrid.CommitEdit()

dataGrid.CancelEdit()

1

我刚刚通过将更改“提交”到作为数据源的DataTable来解决了类似的问题。

因此,如果您的源中有一个DataTable,您可以尝试以下代码:

DataTableSource.AcceptChanges();

0

我通过添加这段代码解决了这个问题:

private void tabControl_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        if (tabControl.SelectedIndex == 1)
        {                               
             WPFdataGrid.CancelEdit(DataGridEditingUnit.Row);                                
        }
    }

我认为这是UI线程的问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接