嗨,我试着理解如何将消息直接发送到特定的目标。我有一个小的SL项目和一个叫class1的笨蛋类。我在类构造函数中注册,并侦听所有字符串类型的消息。
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}
我做错了什么?谢谢你的帮忙
发布于 2010-10-07 22:34:48
是否在任何地方创建了Class1的实例?如果不是,那么它永远不会注册接收任何消息。
您可以通过在Class1构造函数中注册接收消息的代码行上放置一个断点来轻松地测试这一点。
我测试了您的代码,当我在另一个视图模型中注册消息时,它可以工作,但这是因为ViewModelLocator中的任何视图模型都是在加载App.xaml时立即创建的。
发布于 2011-10-23 00:53:35
定义TTarget时,消息由其类型感知,而不是实例。因此,您的代码不起作用(正如您所经历的那样),因为您发送了一条 Class1 类型的消息,但您注册的接收方是String类型,而不是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);});
对我来说,最后一种解决方案更可取。
干杯
https://stackoverflow.com/questions/3873951
复制相似问题