2010-12-11 53 views
5

我們可以在非UI線程中更新WPF控件的數據上下文嗎?WPF線程:我可以在非UI線程中更新控件的數據上下文嗎?

說我們有一個LabelMyClass作爲數據上下文,並結合ContentMyProperty

<Label Name="label" Content="{Binding MyProperty}" />

其中MyClass很簡單:

public class MyClass : INotifyPropertyChanged 
{ 
    int _myField; 
    public int MyProperty 
    { 
     get 
     { 
      return _myField; 
     } 
     set 
     { 
      _myField = value; 
      PropertyChanged(this, new PropertyChangedEventArgs("MyProperty")); 
     } 
    } 
    public event PropertyChangedEventHandler PropertyChanged; 
} 

在非UI線程,我們可以使用myClass.MyProperty = "updated"來更新標籤的內容,但我們不能直接執行label.Content = "updated"。那是對的嗎?

我自己的答案

這裏是我發現:

回答

2

是啊,這是正確的。還有一些額外的注意事項(CollectionChanged事件必須在UI線程中執行)。

通常,您正在使用ObservableCollection<T>綁定到集合。如果您從非UI線程更新此集合,則代碼將中斷,因爲事件是從它們執行的同一線程觸發的(ObservableCollection<T>在集合發生更改時觸發事件)。爲了避免這種情況,您必須提供一個委託給ObservableCollection<T>的定製實現,該定製實現在UI線程中觸發事件(使用Dispatcher)。

+0

您能否給我更詳細的收藏資料?謝謝。 – Shuo 2010-12-11 20:32:16

+0

謝謝,我想我在這裏得到了一個解決方案:http://geekswithblogs.net/NewThingsILearned/archive/2008/01/16/have-worker-thread-update-observablecollection-that-is-bound-to-a.aspx – Shuo 2010-12-11 20:38:14

+0

我也使用過這個,但是有些代碼不起作用(一些wpf對象不能從DispatcherObject繼承)。 – Femaref 2010-12-11 20:46:53