[英]update wpf datagrid cell from other thread
我正在嘗試使用WPF數據網格實現一個簡單的電子表格。 當用戶在單元格中輸入公式時,引擎將計算公式並使用計算出的值更新單元格。 但是我處理的大多數計算都需要很長時間,因此我想在其他線程中進行計算。
我嘗試使用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,因為我使用了Dispatcher.BeginInvoke()。 我的問題似乎是用戶輸入值(公式)覆蓋了我要顯示的計算值。
您不能從另一個線程更新GUI。 幸運的是,.Net提供了一種處理此問題的機制:
uiControl.**Dispatcher**.Invoke(delegate)
例如
dataGrid1.Dispatcher.Invoke(() => MyUpdateFunction(dataGrid1, data))
編輯:抱歉,原始代碼適用於Windows.Forms
使用調度程序不是一個好主意。 如果編碼不正確,它會使用戶界面無響應。 如果計划在多線程設置中使用datagrid,則應使用事件來反映更新。 我建議結合使用ObservableCollection和INotifyPropertyChanged作為更好的選擇。 我在這里發布了一個模板:
http://www.codeproject.com/Articles/1086714/A-Template-For-Using-Datagrid-in-Monitoring-UI
看一下WPF Dispatcher類 。 您有很多選擇可以從Dispatcher執行線程化任務。 查看BeginInvoke和Invoke方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.