2011-12-12 25 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侦听器的搜索将失败。