c# - MVVM没有收到消息

标签 c# wpf mvvm mvvm-light

我在项目上使用mvvm light。对于 View 之间的通信,我使用的是GalaSoft.MvvmLight.Messaging.Messenger,但无法正常工作。
下面的代码:
注册一个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);  

然后工作正常。为什么?

最佳答案

您对RegisterSend的重载感到困惑。在第二个示例中,您正在使用Send的重载:

void Send<TMessage>(TMessage message, object token);

由于您要发送带有特定 token 的消息,因此只有那些使用相同 token 调用Register的消息才会收到该消息。在第一个示例中,您正在使用Register的重载:
void Register<TMessage>(object recipient, Action<TMessage> action);

您没有指定 token ,因此您的对象将不会收到 token 。

如果确实要将此消息仅发送到ServerNewViewModel,请使用唯一的 token ,例如GUID或组成的某些字符串:
string token = "YourServerViewModelToken";
var serverNewViewModel = ServiceLocator.Current.GetInstance<ServerNewViewModel>();
GalaMessenger.Default.Register<ServerNewMessenger>(serverNewViewModel, token, (msg) =>
    {
        Debug.Write("Click");
    });

然后,当您发送它时,请使用相同的 token :
string token = "YourServerViewModelToken";
Messenger.Default.Send<ServerNewMessenger>(newItem, token);

关于c# - MVVM没有收到消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34088467/

相关文章:

javascript - 当 ViewModel 的属性重命名时 Knockout.js 绑定(bind)被破坏

c# - 如何使用 TFS API 2013 获取所有迭代路径

c# - 按钮不能完全点击

c# - WPF如何在处理更多代码之前等待绑定(bind)更新发生?

c# - 从 FileSystemWatcher 事件更新列表框

wpf - 从 WPF DataGrid 中的按钮触发 RelayCommand

c# - 是什么导致错误 "The "ResolveManifestFiles”任务意外失败。路径中有非法字符

c# - 无法在 C# 中删除文件 - 未经授权的访问异常

c# - mvc3 checkboxfor enum 没有枚举在模型中

c# - Windows MVVM中的通用应用程序