我在我的项目中使用 mvvm light。对于视图之间的通信,我使用 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>());
我从来没有收到消息。但是当我通过发送方法删除收件人时:
Messenger.Default.Send<ServerNewMessenger>(newItem);
然后就可以正常工作了。为什么?
您对
Register
和 Send
的重载感到困惑。 在第二个示例中,您使用的是 Send
: 的重载
void Send<TMessage>(TMessage message, object token);
由于您使用特定的 token 发送消息,因此只有那些使用相同令牌调用
Register
的人才会收到该消息。 在第一个示例中,您使用的是 Register
: 的重载
void Register<TMessage>(object recipient, Action<TMessage> action);
您没有指定令牌,因此您的对象将不会收到它。
如果您确实想将此消息发送给just您的
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);
我这边有两个不同的 Messenger 类实例;一份来自 DevExpress(我正在注册),一份来自 Galasoft(我用来发送消息):
...相当棘手!