MVVM 未收到消息

问题描述 投票:0回答:2

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

然后就可以正常工作了。为什么?

c# wpf mvvm mvvm-light
2个回答
3
投票

您对

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);

0
投票

我这边有两个不同的 Messenger 类实例;一份来自 DevExpress(我正在注册),一份来自 Galasoft(我用来发送消息):

  • DevExpress.Mvvm.Messenger
  • GalaSoft.MvvmLight.Messaging.Messenger

...相当棘手!

© www.soinside.com 2019 - 2024. All rights reserved.