在MVVM Light中注册ViewModel外的消息
本文关键字:消息 ViewModel 注册 MVVM Light | 更新日期: 2023-09-27 18:10:55
我试图在静态构造函数中注册ViewModel之外的消息,但显然注册没有采取:当消息发送时,注册的操作从未运行。我尝试在注册时传递null或recipient
参数的新对象,但这不起作用。
我有一种感觉,指定收件人一定很重要,但我不知道为什么。我认为无论如何,所有的收件人都应该收到广播消息。是否有一种方法使此工作或这是根本不支持?
收件人是重要的,当您使用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()
作为收件人,它没有发射,因为它认为我的收件人已经死了。