我在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),但它没有用。
答案 0 :(得分:9)
我通过为DataGrid的Unloaded事件添加此处理程序解决了这个问题:
void DataGrid_Unloaded(object sender, RoutedEventArgs e)
{
var grid = (DataGrid)sender;
grid.CommitEdit(DataGridEditingUnit.Row, true);
}
答案 1 :(得分:4)
我之前遇到过这种情况。 WPF仅将当前选项卡的视图保留在内存中;切换选项卡时,WPF会卸载当前视图并加载所选选项卡的视图。但是,如果当前正在执行AddNew或EditItem事务并且WPF尝试卸载它,则DataGrid会抛出此异常。
我的解决方案是将所有选项卡视图保留在内存中,但只将当前选项卡的视图设置为可见。此链接显示了执行此操作的方法:
WPF TabControl - Preventing Unload on Tab Change?
由于不必重新生成视图,因此当您在标签之间切换时,此更改还会使标签加载更加顺畅。在我的情况下,额外的内存使用是一个合理的权衡。
答案 2 :(得分:0)
我刚刚通过"提交"解决了类似的问题。更改为我的数据源DataTable。
因此,如果您在源代码中有DataTable,则可以尝试以下代码:
DataTableSource.AcceptChanges();
答案 3 :(得分:0)
我已经通过添加这段代码解决了这个问题:
private void tabControl_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
if (tabControl.SelectedIndex == 1)
{
WPFdataGrid.CancelEdit(DataGridEditingUnit.Row);
}
}
我认为这是UI线程的问题。