我试图用WPF datagrid实现一个简单的电子表格。 当用户在单元格中输入公式时,引擎会计算公式并使用计算值更新单元格。但我处理的大部分计算都需要很长时间,所以我想要在其他线程中计算这些计算。从其他线程更新wpf datagrid单元格
我试图用下面的CellEditEnding事件来实现它。 (DataGrid1中的ItemsSource绑定到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”的单元格?
编辑:我的代码不会抛出任何InvalidOperationException bcz我使用Dispatcher.BeginInvoke()。我的问题似乎是用户输入值(公式)覆盖了我想要显示的计算值。
我知道的Dispatcher.Invoke()。你可以看到我的代码。我已经使用它,我的代码不会抛出任何InvalidOperationException。 – 2010-07-27 04:31:34
对不起,我错过了。 问题可能出在匿名函数闭包(即:存储错误的值)。 您是否尝试在Calc例程(它更新单元格值)的末尾设置断点? – sukru 2010-07-27 05:19:11
还有一件事,你可以尝试移动r和c的计算。 – sukru 2010-07-27 05:22:47