2011-12-12 38 views
5

我剛剛將我的SL4應用程序升級到SL5。我下載了用於SL 5的MVVM light toolkit源代碼並構建它: http://mvvmlight.codeplex.com/SourceControl/changeset/changes/17256019ad97SLVM更新後MVVM光消息傳遞中斷了嗎?

最初一切正常,但GalaSoft消息傳遞不知何故中斷。 消息已發送,但從未接收(使用Messenger.Default.Register)。 沒有生成警告/錯誤,並在輸出窗口中沒有錯誤。

是否有人知道有關新MVVM Light SL5更新的任何重大更改?

/托馬斯

+3

您能否請您在laurent(at)galasoft(dot)ch上給我一個repro ch,我想調查。謝謝! – LBugnion

+0

我使用Silverlight 5安裝程序中的最新MVVM light 3,並且消息仍然有效,因此它必須來自您的設置。 – jv42

+0

我看到的唯一出現在'RaisePropertyChanged()'中,但是在@ LBugnion的博客中記錄了這一點。 – jv42

回答

0

我已經從舊版本MVVM光(變更集3bdbffb4e70a「BL0014雜項」)進行升級時,同樣的事情發生在我身上。即時發送()停止工作。

要解決該問題,請嘗試使用使用receiveDerivedMessagesToo設置爲true的.Register()重載。

當Send()爲其創建一些類型的DynamicProxy的對象時,可能會發生此問題。例如,當您在數據上下文的任何集合下使用Local屬性時,EntityFramework將執行此操作。

例如的EntityFramework的DbContext爲ctx.Dealers.Local會產生類型的項目,看起來像列表:

當匹配註冊的偵聽器Messenger.SendToTargetOrType() System.Data.Entity.DynamicProxies.Dealer_D4CEAA0F527F5360DEB9B2B35305241B76A107C37B9DB8B368984B7DF69AEE1E因爲將失敗註冊類型只是一個「經銷商」,而不是代理商。

爲什麼這用於在不要求receiveDerivedMessagesToo設置爲true的情況下工作而現在不用?

此前MVVM光「Messenger.cs」 Messenger.SendToTargetOrType()有這樣的代碼:

private void SendToTargetOrType<TMessage>(TMessage message, Type messageTargetType, object token) 
{ 
    var messageType = typeof(TMessage); 

這個工作偉大的,因爲傳遞的數據的實際類型並不重要,臨時用戶的剛型類型。

現在代碼已被更改爲:

private void SendToTargetOrType<TMessage>(TMessage message, Type messageTargetType, object token) 
{ 
    Type messageType = message.GetType(); 

現在正在使用的參數的類型來代替。這是一個問題,因爲如果你的「消息」是某種類型的代理,那麼Registed偵聽器的搜索將失敗。