我在我的项目中使用mvvm灯。对于视图之间的通信,我使用的是GalaSoft.MvvmLight.Messaging.Messenger但它没有按预期工作。
代码如下:
注册信使
GalaMessenger.Default.Register<ServerNewMessenger>(ServiceLocator.Current.GetInstance<ServerNewViewModel>(), (msg) =>
{
Debug.Write("Click");
});
将信使发送给收件人
Messenger.Default.Send<ServerNewMessenger>(newItem, ServiceLocator.Current.GetInstance<ServerNewViewModel>());
我从未收到过这条消息。但是当我通过send方法删除收件人时:
Messenger.Default.Send<ServerNewMessenger>(newItem);
然后它工作正常。为什么呢?
答案 0 :(得分:2)
您对Register
和Send
的重载感到困惑。在您的第二个示例中,您正在使用Send
的重载:
void Send<TMessage>(TMessage message, object token);
由于您发送的邮件包含特定的令牌,因此只有那些使用相同令牌调用Register
的邮件才会收到该邮件。在您的第一个示例中,您正在使用Register
的重载:
void Register<TMessage>(object recipient, Action<TMessage> action);
您没有指定任何令牌,因此您的对象将不会收到它。
如果您确实要将此消息发送到只是 ServerNewViewModel
,请使用GUID
之类的唯一标记或您组成的某个字符串:
string token = "YourServerViewModelToken";
var serverNewViewModel = ServiceLocator.Current.GetInstance<ServerNewViewModel>();
GalaMessenger.Default.Register<ServerNewMessenger>(serverNewViewModel, token, (msg) =>
{
Debug.Write("Click");
});
然后当你发送它时,使用相同的标记:
string token = "YourServerViewModelToken";
Messenger.Default.Send<ServerNewMessenger>(newItem, token);