在MVVM Light中注册ViewModel外的消息

本文关键字:消息 ViewModel 注册 MVVM Light | 更新日期: 2023-09-27 18:10:55

我试图在静态构造函数中注册ViewModel之外的消息,但显然注册没有采取:当消息发送时,注册的操作从未运行。我尝试在注册时传递null或recipient参数的新对象,但这不起作用。

我有一种感觉,指定收件人一定很重要,但我不知道为什么。我认为无论如何,所有的收件人都应该收到广播消息。是否有一种方法使此工作或这是根本不支持?

在MVVM Light中注册ViewModel外的消息

收件人是重要的,当您使用Messenger.Register Messenger.Send它是不重要的。然而,在MVVM中的 WeakReference WeakAction实现中有一个已知的错误,该错误持有对接收者的引用,尽管它应该释放它。

简而言之,如果您在ViewModel中,请确保调用Cleanup。在视图中,在Unloaded事件中调用Messenger.Unregister(this),例如

public MyView() {
    this.Unloaded += (o, e) => { Messenger.Unregister(this); }
}

在其他类中,您将不得不实现IDisposable或使用其他机制来注销消息接收者。

参见:

  • MVVM轻监听器不释放/确定性结束注册对象?
  • mvvm light v3 unregister工作正常吗?
  • 何时在MVVM Light中处置ViewModel

没关系,我查看了源代码并弄清楚发生了什么。它将接收者添加为WeakReference来判断它是否活着。我只是在传递new object()作为收件人,它没有发射,因为它认为我的收件人已经死了。