嗨,我试着理解如何直接向特定目标发送消息。我有一个小型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}
我做错了什么? 谢谢你的帮助
答案 0 :(得分:0)
是否在任何地方创建了Class1的实例?如果没有,那么它永远不会注册接收任何消息。
您可以通过在注册接收Class1构造函数中的消息的代码行上放置一个断点来轻松测试。
我测试了你的代码,当我在另一个视图模型中注册消息时,它就有效,但这是因为ViewModelLocator中的所有视图模型都是在加载App.xaml后立即创建的。
答案 1 :(得分:0)
当TTarget定义时,消息是通过其类型而不是实例来识别的。 因此,您的代码无法正常工作(正如您所见),因为您发送了一条 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);});
对我来说,最后的解决方案是首选的。
干杯