SL5更新后MVVM轻松消息被破坏了吗?

时间:2011-12-12 09:01:30

标签: silverlight mvvm-light silverlight-5.0

我刚刚将SL4应用程序升级到SL5。我为SL 5下载了MVVM light toolkit源代码并构建它: http://mvvmlight.codeplex.com/SourceControl/changeset/changes/17256019ad97

最初一切正常,但GalaSoft的消息传递在某种程度上被破坏了。 消息被发送,但接收器从未接收(使用Messenger.Default.Register)。 没有构建警告/错误,输出窗口中没有错误。

是否有人知道与新MVVM Light SL5更新有关的任何重大变化?

/托马斯

1 个答案:

答案 0 :(得分:0)

从旧版本的MVVM Light(更改集3bdbffb4e70a“BL0014 Misc”)升级时,我遇到了同样的事情。立即发送()停止工作。

要解决此问题,请尝试使用.Register()重载,并将receiveDerivedMessagesToo设置为true。

当Send()为其创建某种类型的DynamicProxy的对象时,可能会发生此问题。例如,当您在数据上下文的任何集合下使用Local属性时,EntityFramework将执行此操作。

e.g。 ctx.Dealers.Local的EntityFramework DBContext将生成一个类似于以下类型的项目列表: 的 System.Data.Entity.DynamicProxies.Dealer_D4CEAA0F527F5360DEB9B2B35305241B76A107C37B9DB8B368984B7DF69AEE1E

当匹配注册听众时,Messenger.SendToTargetOrType()将失败,因为注册类型只是“经销商”而不是经销商的代理。

为什么这种情况过去没有要求将receiveDerivedMessagesToo设置为true而现在没有?

以前MVVM Light“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侦听器的搜索将失败。