实际上,您可以从应用程序中的任何位置注册特定消息的收件人,而不仅仅是从作为收件人的类中注册。例如,考虑以下场景:
public class ClassA : ViewModelBase
{
public ClassA()
{
Messenger.Default.Register<SomeMessage>(this, SomeAction);
Messenger.Default.Register<SomeMessage>(ViewModelLocator.ClassB, SomeAction);
}
private void SomeAction(SomeMessage msg)
{
// do something
}
}
public class ClassB : ViewModelBase
{
public ClassB()
{
}
}
在第二个Registor
方法调用的情况下,Action 的 Target 属性将与接收者参数不同。因此,为了保持一致,总是需要收件人参数很可能更安全。
当然,您是正确的,这种情况可能比您简单地this
作为收件人传递的情况不太常见。因此,在这种情况下,如果键入this
对您来说变得很麻烦,那么您始终可以定义自己的Register
扩展方法,该方法只需将 Target 属性传递给实际Register
方法:
public static class MessengerHelper
{
public static void Register<TMessage>(this IMessenger messenger, Action<TMessage> action)
{
messenger.Register<TMessage>(action.Target, action);
}
}
然后,您可以注册这样的消息:
public class ClassA : ViewModelBase
{
public ClassA()
{
Messenger.Default.Register<SomeMessage>(SomeAction);
}
private void SomeAction(SomeMessage msg)
{
// do something
}
}