19

我在 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) 并且没有用。

4

5 回答 5

14

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

    void DataGrid_Unloaded(object sender, RoutedEventArgs e)
    {
        var grid = (DataGrid)sender;
        grid.CommitEdit(DataGridEditingUnit.Row, true);
    }
于 2015-12-08T01:30:30.387 回答
4

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

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

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

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

于 2013-12-06T18:29:19.370 回答
3

在 Xaml 中:

Loaded="OnUserControlLoaded"

Unloaded="OnUserControlUnloaded"

在内部代码OnUserControlLoadedOnUserControlUnloaded方法中:

dataGrid.CommitEdit()

dataGrid.CancelEdit()
于 2016-04-11T09:41:57.527 回答
0

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

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

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

于 2015-04-13T18:15:18.440 回答
0

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

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

DataTableSource.AcceptChanges();
于 2014-09-24T08:22:32.393 回答