MVVM没有收到消息

时间:2015-12-04 12:30:19

标签: c# wpf mvvm mvvm-light

我在我的项目中使用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);  

然后它工作正常。为什么呢?

1 个答案:

答案 0 :(得分:2)

您对RegisterSend的重载感到困惑。在您的第二个示例中,您正在使用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);