我刚刚将SL4应用程序升级到SL5。我为SL 5下载了MVVM light toolkit源代码并构建它: http://mvvmlight.codeplex.com/SourceControl/changeset/changes/17256019ad97
最初一切正常,但GalaSoft的消息传递在某种程度上被破坏了。 消息被发送,但接收器从未接收(使用Messenger.Default.Register)。 没有构建警告/错误,输出窗口中没有错误。
是否有人知道与新MVVM Light SL5更新有关的任何重大变化?
/托马斯
答案 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侦听器的搜索将失败。