2012-01-08 40 views
4

如果你實現INotifyPropertyChanged,你可以在非UI線程中引發事件 - 我應該避免這種情況,爲什麼?不在UI線程中觸發PropertyChanged的副作用是什麼?

更新:這是關於綁定在wpf應用程序。

+0

您是否可以從非UI線程中successfully調用NotifyPropertyChanged?通過設計,只有創建UI對象的線程才能訪問該對象。常見的用法是在後臺創建昂貴的對象,然後在回調中(在UI上)綁定對象或調用NotifyPropertChanged。 – Paparazzi 2012-01-08 15:54:10

回答

4

不,你不應該避免這一點。 WPF將代表您的UI線程編組爲PropertyChanged事件,但即使沒有,也可能不是組件的責任。

更新:我稍微誤解了你的問題。出於某種原因,我認爲你是在具體詢問與UI不直接相關的背景組件。

如果您的組件旨在供UI直接使用,那麼對UI線程進行編組更改可能很有意義,例如使用Windows窗體。但是,如果組件與用戶界面無關,通常不會有意義,但如果需要,可以使用當前的SynchronizationContext以不可知的方式切換到UI線程。

我會在需要時使用WPF進行編組,因爲正如我通常所說的那樣,您不需要WPF爲您做。但是,如果您也在更改集合,那麼您將需要,因爲此類更改不會自動編組。

+1

在.NET 4.5中引入BindingOperations類具有靜態EnableCollectionSynchronization方法,該方法允許您將鎖對象與ObservableCollection(更確切地說是和IEnumerable實例)相關聯。這會在綁定到itemssource時通知綁定機制在枚舉過程中鎖定(刷新視圖內容)。因此,現在綁定到在非UI線程上更新的集合將不會成爲問題(只要在更改或觀察viewmodel內的集合時使用相同的鎖定)。最後,我在視圖模型中擺脫了Dispatcher。 – Frode 2013-10-04 08:43:55

0

如果您使用數據綁定,這可能會導致綁定框架遇到異常。例如,winforms綁定是而不是期望這樣,並且通常會遇到麻煩。

雖然依賴於框架,也許(我gebuinely不知道),例如,WPF支持這一點。

+0

WPF確實支持這非常方便。 – 2012-01-08 12:31:20

相關問題