"DeferRefresh" не разрешается во время транзакции AddNew или EditItem

У меня есть элемент управления вкладками в графическом интерфейсе, и на одной из вкладок есть дата-схема WPF 4.0. Когда я нажимаю на ячейку в сетке и что-то редактирую, а затем переключаю вкладки, я получаю ошибку повторного обновления:

DeferRefresh 'не разрешено во время транзакции AddNew или EditItem.

Таким образом, я вызываю datagrid.CancelEdit(DataGridEditingUnit.Row), когда табуляция переключается для отмены любого ожидающего редактирования, и проблема с повторным обновлением отсутствует.

Но то, что я действительно хочу сделать, это CommitEdit(), так что пользователю не нужно снова вводить данные.

И datagrid.CommitEdit(DataGridEditingUnit.Row, true) не работает для меня. Я получаю следующую ошибку: CommitEnd():

Невозможно выполнить эту операцию, пока обработка диспетчера приостановлено.

PS: Я пробовал datagrid.CommitEdit() и datagrid.CommitEdit(DataGridEditingUnit.Column, true), и он не работал.

Ответ 1

Я решил это, добавив этот обработчик для события DataGrid Unloaded:

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

Ответ 2

Я уже сталкивался с этим. WPF сохраняет только текущий вид табуляции в памяти; при переключении вкладок WPF выгружает текущее представление и загружает представление выбранной вкладки. Однако DataGrid генерирует это исключение, если в настоящее время выполняется транзакция AddNew или EditItem, и WPF пытается ее выгрузить.

Решение для меня состояло в том, чтобы сохранить все представления табуляции в памяти, но только для отображения текущей вкладки. Эта ссылка показывает способ этого:

WPF TabControl - предотвращение разгрузки при изменении вкладки?

Это изменение также сделает ваши вкладки более плавными при переключении между ними, потому что просмотр не нужно регенерировать. В моем случае использование дополнительной памяти было разумным компромиссом.

Ответ 3

Я просто решил аналогичную проблему путем "комминирования" изменений в DataTable, который является моим источником данных.

Итак, если у вас есть DataTable в источнике, вы можете попробовать следующий код:

DataTableSource.AcceptChanges();

Ответ 4

Я исправил эту проблему, добавив этот фрагмент кода:

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

Я думаю, что это проблема потоков пользовательского интерфейса.

Ответ 5

В Xaml:

Loaded="OnUserControlLoaded"

Unloaded="OnUserControlUnloaded"

В коде за пределами внутри OnUserControlLoaded и OnUserControlUnloaded Методы:

dataGrid.CommitEdit()

dataGrid.CancelEdit()