2012-03-31 205 views
0

更新一個TreeView的ItemsSource我有這樣的功能:每個用戶執行某些操作時在另一個線程

public void UpdateList() 
{ 
BindList = Model.GetList(); 
TreeView1.ItemsSource = BindList; 
} 

UpdateList()需要被調用(因此樹視圖列表重新加載)。它目前工作,它只是非常緩慢,所以我想在另一個線程中執行它。

我對WPF相當陌生...在WinForms程序中,我用於製作委託並檢查InvokeRequired等。但是我發現這在WPF中不起作用。

所以,如果我想調用UpdateList(),以便它在另一個線程中運行,並且ItemsSource從另一個線程更新,那麼我應該如何執行?

感謝

+0

[MSDN(HTTP: //msdn.microsoft.com/en-us/library/ms741870.aspx) – 2012-03-31 14:39:10

+0

不應該這樣的事實,即ItemsSource已經綁定(BindList)到TreeView,並且線程函數正在更新BindList,這意味着UI應該自動反映這一點? – theqs1000 2012-03-31 14:53:00

+0

在這個函數中,你正在訪問一個UI元素,它不能在後臺線程上完成,你可以改變這個集合本身,但它需要實現INotifyCollectionChanged。 – 2012-03-31 14:55:38

回答

1
  1. 變化Model.GetList()功能財產ObservableCollection<>類型例如:

    public ObservableCollection<DataItem> List { get; set; }

  2. 呼叫TreeView1.ItemsSource = Model.List只有一次。它爲您提供了WPF綁定的優點。

  3. 創建一個BackgroundWorker以加載處理程序中的數據DoWork。將數據加載到臨時收集並將該收集複製到Model.ListRunWorkerCompleted處理程序。
    如果你想更新你的樹,而數據加載,你可以看看這個方法:WPF update binding in a background thread

  4. 閱讀和學習MVVM pattern瞭解WPF的主要思想發展