MVVM-Light:与Target的Messenger

时间:2010-10-06 15:07:11

标签: mvvm-light

嗨,我试着理解如何直接向特定目标发送消息。我有一个小型SL项目和一个名为class1的dunmmy类。我在类构造函数和listenig中注册了所有字符串类型的消息。

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但是项目。 Action.Target.GetType()返回类似于:{System.Collections.Generic.Dictionary 2System.Type,System.Collections.Generic.List 1 [SLDuninLib.Messages.Avise + WeakActionAndToken]]} System.Type {System.RuntimeType}

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

2 个答案:

答案 0 :(得分:0)

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

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

我测试了你的代码,当我在另一个视图模型中注册消息时,它就有效,但这是因为ViewModelLocator中的所有视图模型都是在加载App.xaml后立即创建的。

答案 1 :(得分:0)

当TTarget定义时,消息是通过其类型而不是实例来识别的。 因此,您的代码无法正常工作(正如您所见),因为您发送了一条 Class1 类型的邮件,但您注册的收据是字符串类型,而不是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);});

对我来说,最后的解决方案是首选的。

干杯