Ответ 1
Я решил это, добавив этот обработчик для события DataGrid Unloaded:
void DataGrid_Unloaded(object sender, RoutedEventArgs e)
{
var grid = (DataGrid)sender;
grid.CommitEdit(DataGridEditingUnit.Row, true);
}
У меня есть элемент управления вкладками в графическом интерфейсе, и на одной из вкладок есть дата-схема 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), и он не работал.
Я решил это, добавив этот обработчик для события DataGrid Unloaded:
void DataGrid_Unloaded(object sender, RoutedEventArgs e)
{
var grid = (DataGrid)sender;
grid.CommitEdit(DataGridEditingUnit.Row, true);
}
Я уже сталкивался с этим. WPF сохраняет только текущий вид табуляции в памяти; при переключении вкладок WPF выгружает текущее представление и загружает представление выбранной вкладки. Однако DataGrid генерирует это исключение, если в настоящее время выполняется транзакция AddNew или EditItem, и WPF пытается ее выгрузить.
Решение для меня состояло в том, чтобы сохранить все представления табуляции в памяти, но только для отображения текущей вкладки. Эта ссылка показывает способ этого:
WPF TabControl - предотвращение разгрузки при изменении вкладки?
Это изменение также сделает ваши вкладки более плавными при переключении между ними, потому что просмотр не нужно регенерировать. В моем случае использование дополнительной памяти было разумным компромиссом.
Я просто решил аналогичную проблему путем "комминирования" изменений в DataTable, который является моим источником данных.
Итак, если у вас есть DataTable в источнике, вы можете попробовать следующий код:
DataTableSource.AcceptChanges();
Я исправил эту проблему, добавив этот фрагмент кода:
private void tabControl_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
if (tabControl.SelectedIndex == 1)
{
WPFdataGrid.CancelEdit(DataGridEditingUnit.Row);
}
}
Я думаю, что это проблема потоков пользовательского интерфейса.
В Xaml:
Loaded="OnUserControlLoaded"
Unloaded="OnUserControlUnloaded"
В коде за пределами внутри OnUserControlLoaded
и OnUserControlUnloaded
Методы:
dataGrid.CommitEdit()
dataGrid.CancelEdit()