Я пытаюсь реализовать простую таблицу с использованием WPat datagrid. Когда пользователь вводит формулу в ячейке, двигатель вычисляет формулу и обновляет ячейку с вычисленным значением. Но большинство вычислений, которые я обрабатываю, занимают много времени, поэтому я хочу рассчитать их в других потоках.обновление wpf datagrid cell из другой темы
Я попытался реализовать это, используя событие CellEditEnding, как показано ниже. (The ItemsSource из DataGrid1 связан с DataTable DTAB.)
private void dataGrid1_CellEditEnding(object sender, DataGridCellEditEndingEventArgs e) {
Action calc =() => {
int r = dataGrid1.Items.IndexOf(e.Row.Item);
int c = dataGrid1.Columns.IndexOf(e.Column);
dtab.Rows[r].SetField(c, "X"); // a calculated value
};
Action update =() => {
if (dataGrid1.Dispatcher.CheckAccess()) calc();
else dataGrid1.Dispatcher.BeginInvoke(calc);
};
//update(); // run from the same ui thread
Task.Factory.StartNew(update); // run from a different thread
}
Когда он обновляет значение ячейки из одной и той же UI потоке, клетка обновляется со значением «X», а из другого потока, это не , Как я могу обновить ячейку со значением «X» из другого потока?
EDIT: мой код не выбрасывает InvalidOperationException bcz, я использовал Dispatcher.BeginInvoke(). Моя проблема кажется, что входное значение (формула) пользователя перезаписывает вычисленное значение, которое я хочу отобразить.
я знаю о Dispatcher.Invoke(). Вы можете увидеть мой код. Я уже использую его, и мой код не вызывает никакого InvalidOperationException. –
Извините, я пропустил это. Проблема может заключаться в закрытии анонимной функции (то есть: неправильные значения сохраняются). Вы пытались установить точку останова в конце процедуры Calc (где она обновляет значение ячейки)? – sukru
Еще одна вещь, вы можете попытаться переместить вычисления r и c снаружи. – sukru