2014-10-29 39 views
0

我正在寫一個程序,通過串行端口從設備讀取信息。我有一個數據網格中可用設備的列表。當用戶點擊一行時,它從設備中獲取信息並將其顯示在單獨的列表中。設備通常需要大約一秒的時間來響應並填充信息。但是,在這一秒內,datagrid行不會按選定的高亮顯示。因此,從鼠標單擊數據網格行的時間大約需要一秒鐘,以便實際顯示爲突出顯示/選擇。WPF - Datagrid選擇與後臺工作變更

我認爲一個後臺工作線程將是最好的東西用於此,但我得到了與下面的代碼相同的結果。我是否錯誤地使用了它,或者是否有其他方法可以選擇DataGrid行?

private void relayList_SelectionChanged(object sender, SelectionChangedEventArgs e) 
{ 
    BackgroundWorker worker = new BackgroundWorker(); 
    worker.DoWork += GetLinks; 
    worker.RunWorkerAsync(); 
} 

private void GetLinks(object sender, DoWorkEventArgs e) 
{ 
    //send message to viewModel and do time-consuming work here 
} 
+0

而不是在SelectionChanged事件內讀取,在MouseUp事件中,當然有條件來確定是否應該開始讀取。 – MikeG 2014-10-29 17:24:48

+0

您確定延遲〜1秒代表等待設備所用的時間,而不是更新用戶界面的時間?最好在這裏花費太多時間之前驗證一下。還要確保在進行計算時不會將自己從視圖模型中重新組裝回「Dispatcher」。 – 2014-10-29 19:25:37

+0

對不起,我被叫走了。感謝您的迴應;我會嘗試並更新。 – mikeminer 2014-10-29 21:48:34

回答

0

BackgroundWorker有一個RunWorkerCompleted方法。它將運行在UI線程的執行上下文中。

還有一個結果屬性,用於將結果傳遞給RunWorkerCompleted方法的下一個方法。

private void yourMethod() 
{ 
    BackgroundWorker worker = new BackgroundWorker(); 
    worker.DoWork += DoWorkMethod; 
    worker.RunWorkerCompleted += RunWorkerCompletedMethod; 
    worker.RunWorkerAsync(); 
} 

private void RunWorkerCompletedMethod(object sender, RunWorkerCompletedEventArgs e) 
{ 
    string result = (string)e.Result; 

    // do stuff here 
} 

private void DoWorkMethod(object sender, DoWorkEventArgs e) 
{ 
    e.Result = string.Empty; // Your device data 
} 

如果你絕對不想使用完整的方法。不要使用調度程序,而應使用SynchronizationContext。

當您第一次運行表單時,您需要在字段中存儲SynchronizationContext.Current,但在此之後,您可以調用UI線程上所需的任何內容。