2012-05-03 57 views
0

我想使用多線程將項目(UserControl)設置爲ItemsControl。我的代碼喜歡這個如何使用多線程將用戶控件添加到ItemsControl?

System.Threading.Thread thread = new System.Threading.Thread(new System.Threading.ThreadStart(SetItemsControl)); 
    thread.Start(); 

    void SetItemsControl() 
    { 
     IDictionary<string, object> list = GetUserControlList(); // this function return list of UserControl 
     this.Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.Normal, 
      new Action(delegate() 
      { 
       mylistcontrol.ItemsSource = list; 

      })); 
    } 

而且它打破了在我的用戶

調用線程必須STA的我的初始化函數,因爲許多UI組件都需要這個。

我該如何解決?

+0

你可以嘗試設置thread.SetApartmentState(ApartmentState.STA);在開始之前。布我不知道這是否會導致其他問題 – Dtex

+0

是的。我試過了。發生了線程問題。 調用線程不能訪問此對象,因爲不同的線程擁有它。 – ChauGiang

回答

2

正確的做法是更新綁定到ItemsControl.ItemsSource的集合。在這種情況下,您不會觸摸另一個線程中的可視元素 - 更新綁定到它的集合。正在更新的集合告訴綁定刷新,這就是當數據進入UI時,它發生在UI線程中,所以沒關係。注意收集應該實現INotifyCollectionChanged接口能夠做到這一點

+0

我使用ObservableCollection 來存儲集合並將其綁定到ItemsControl。但同樣的錯誤發生。 – ChauGiang

+0

請發佈更新此集合的代碼 – EvAlex

+0

我添加了RootData類。 'private ObservableCollection list = new ObservableCollection (); 公共無效AddFriend(列表 _list) { 如果(_list!= NULL){ 爲 (INT I = 0;我<_list.Count;我++){ list.Add(_list [I]); } } } ' 在SetItemsControl功能,我改變到 'this.Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.Normal, 新動作(委託() { rootdata.AddFriend(列表) ; }));' – ChauGiang

相關問題