首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MVVM-Light : TTarget信使

MVVM-Light : TTarget信使
EN

Stack Overflow用户
提问于 2010-10-06 23:07:11
回答 2查看 827关注 0票数 1

嗨,我试着理解如何将消息直接发送到特定的目标。我有一个小的SL项目和一个叫class1的笨蛋类。我在类构造函数中注册,并侦听所有字符串类型的消息。

代码语言:javascript
复制
public class Class1
{
    public Class1()
    {
        Messenger.Defaut.Register<String>(this, f => { TraiteMessage(f); });
    }

    public void TraiteMessage(string sMessage)
    {
        MessageBox.Show("Class1:" + sMessage);
    }
}

现在我像这样发送消息:

Messenger.Defaut.Send<String, Class1>("test message");

消息未到达目标。当我查看MVVM的内部源代码时,我可以看到测试是这样完成的: item.Action.Target.GetType() == messageTargetType,但实际上messageTargetType被设置为: MyProejet.Class1,但item.Action.Target.GetType()返回的内容如下:{System.Collections.Generic.Dictionary2System.Type,System.Collections.Generic.List1SLDuninLib.Messages.Avise+WeakActionAndToken]} System.Type {System.RuntimeType}

我做错了什么?谢谢你的帮忙

EN

回答 2

Stack Overflow用户

发布于 2010-10-07 22:34:48

是否在任何地方创建了Class1的实例?如果不是,那么它永远不会注册接收任何消息。

您可以通过在Class1构造函数中注册接收消息的代码行上放置一个断点来轻松地测试这一点。

我测试了您的代码,当我在另一个视图模型中注册消息时,它可以工作,但这是因为ViewModelLocator中的任何视图模型都是在加载App.xaml时立即创建的。

票数 0
EN

Stack Overflow用户

发布于 2011-10-23 00:53:35

定义TTarget时,消息由其类型感知,而不是实例。因此,您的代码不起作用(正如您所经历的那样),因为您发送了一条 Class1 类型的消息,但您注册的接收方是String类型,而不是Class1类型。

因此,在这种情况下,可以考虑几种解决方案。

  • 使Class1成为静态消息,并处理收到的消息,如下所示:

Messenger.Defaut.Register<Class1>(this, msg => { Class1.TraiteMessage(msg); });

  • 或,以与注册类型相同的字符串类型发送消息。

Messenger.Defaut.Send<String, String>("test message");

  • 或,定义一个包含您想要在它们之间传递的变量的小结构,如下所示。

public struct SearchTerm { public string Category; public string Keyword; }

按如下方式发送:

Messenger.Default.Send(new SearchTerm{Category = "Q",Keyword = "something"}));

并在Class1中消费,如下所示:

Messenger.Default.Register<SearchTerm>(this,msg => {TraiteMessage(msg.Keyword);});

对我来说,最后一种解决方案更可取。

干杯

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3873951

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档