2010-10-22 83 views
1

我在Silverlight中創建了一個View Model。此視圖模型有一個事件定義爲:在Silverlight中使用SynchronizationContext引發事件

public event EventHandler Data_Loaded; 

我想在服務調用數據完成時「引發」此事件。這將使我的用戶界面能夠正確響應。請注意,這不僅僅是一個簡單的綁定場景,這就是爲什麼我想要這個事件。

服務調用通過HttpWebRequest進行。一旦這個請求完成,我正確地解析結果。我試圖讓UI知道我完成了,但最初我得到一個錯誤,說「無效的跨線程訪問」。我跟一位同事說,我應該使用SynchronizationContext.Current舉辦一個活動。不幸的是,我不明白如何做到這一點。有人可以向我解釋嗎?

回答

2

您需要使用Dispatcher來強制在UI線程上引發事件。

Deployment.Current.Dispatcher.BeginInvoke(() => DataLoaded(this,EventArgs.Empty)); 
+0

我沒有在UI上引發事件。用戶界面正在訂閱ViewModel上的事件。如果我使用Dispatcher,看起來用戶界面與ViewModel緊密耦合。我錯了嗎? – user462166 2010-10-22 14:00:35

+0

問題的關鍵在於,如果您的用戶界面正在偵聽此事件,則必須從UI線程中引發該事件。雖然可以使用SyncronizationContext,但如果您不在UI線程上,SyncronizationContext.Current將爲null,但這可能會是一個真正的痛苦。這意味着您需要在UI線程上獲取SyncronizationContext並將其存儲在某處。然後,您可以使用它將回調集中到正確的線程。一般來說,在Silverlight中,只要使用Deployment而不是App.RootVisual來訪問Dispatcher,我就不會認爲它是緊密耦合的。 – Stephan 2010-10-22 14:34:07