2010-10-06 57 views
1

嗨,我试图理解如何直接发送消息到speciciel目标。我得到了一个小型的SL projet和一个叫做class1的dunmmy类。我在类构造函数中注册并侦听所有字符串类型的消息。MVVM-Light:使用TTarget的信使

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

我该怎么办错了吗? 感谢您的帮助

回答

0

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

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

我测试你的代码,当我在另一个视图模型消息登记,但是这是因为在ViewModelLocator任何视图模型只要App.xaml中加载创建它的工作原理。

+0

是的,class1在MainPage.xaml.ca载入事件中是instanciate。用于测试目的。 – Pierre 2010-10-08 13:17:29

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"}));

和消耗到Class如下:

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

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

干杯