5

我刚刚将我的 SL4 应用程序升级到 SL5。我下载了 SL 5 的 MVVM 灯光工具包源并构建它: http: //mvvmlight.codeplex.com/SourceControl/changeset/changes/17256019ad97

最初一切正常,但 GalaSoft 消息不知何故坏了。消息已发送,但从未被接收者接收(使用 Messenger.Default.Register)。输出窗口中没有构建警告/错误,也没有错误。

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

/托马斯

4

1 回答 1

0

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

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

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

例如 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();

现在改为使用参数的类型。这是一个问题,因为如果您的“消息”是某种类型的代理,则注册侦听器的搜索将失败。

于 2012-01-10T05:09:55.817 回答