【问题标题】:MVVM does not receive messageMVVM 没有收到消息
【发布时间】:2015-12-04 22:46:32
【问题描述】:

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

我从来没有收到过消息。但是当我通过 send 方法删除收件人时:

Messenger.Default.Send<ServerNewMessenger>(newItem);  

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

【问题讨论】:

  • 在 Default.Send 之前初始化包含 Default.Register 的类/函数非常重要。这可能是你的问题。检查一下。
  • 是的,我确实在 Default.Send 之前执行了 Default.Register。
  • GetInstance 的调用是否在每次调用时返回不同的实例?
  • 是的,我使用GetHashCode() 方法进行验证,它显示了相同的代码,这意味着它指向同一个对象。

标签: c# wpf mvvm mvvm-light


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2011-09-07
    • 2017-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-03
    • 2019-12-12
    • 2021-10-26
    相关资源
    最近更新 更多