C# 在MVVM Light中注册ViewModel之外的消息?

C# 在MVVM Light中注册ViewModel之外的消息?,c#,.net,mvvm,mvvm-light,C#,.net,Mvvm,Mvvm Light,我试图在静态构造函数中注册ViewModel之外的消息,但显然没有注册:发送消息时,注册操作从未运行。注册时,我尝试为recipient参数传递null或新对象,但没有成功 我有一种感觉,指定收件人一定很重要,但我不知道为什么。我以为所有的收件人都应该收到广播信息。有什么方法可以让它工作呢,还是根本不受支持?没关系,我仔细研究了源代码,找出了发生的事情。它将收件人添加为WeakReference,以确定它是否还活着。我只是将新对象()作为收件人传入,但它没有启动,因为它认为我的收件人已死亡。当您

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


我有一种感觉,指定收件人一定很重要,但我不知道为什么。我以为所有的收件人都应该收到广播信息。有什么方法可以让它工作呢,还是根本不受支持?

没关系,我仔细研究了源代码,找出了发生的事情。它将收件人添加为WeakReference,以确定它是否还活着。我只是将
新对象()
作为收件人传入,但它没有启动,因为它认为我的收件人已死亡。

当您使用
Messenger时,收件人很重要。为
Messenger注册
。发送
不重要。但是,MVVM中的
WeakReference
WeakAction
实现中存在一个已知的bug,该bug包含对收件人的引用,尽管它应该释放它

简言之,如果您在ViewModel中,请确保调用
清理
。在视图中,调用
Messenger。在
Unload
事件中取消注册(此)
,例如

public MyView() {
    this.Unloaded += (o, e) => { Messenger.Unregister(this); }
}
在其他类中,您必须实现
IDisposable
或使用其他机制来注销邮件收件人

另见:


WeakReference中有一个错误,它包含对收件人的引用?我认为这个类的全部目的是不持有一个可以防止对象被垃圾收集的强引用。问题与作为方法处理程序传递的方法有关。此方法不能很弱,因此会导致对象未被垃圾收集。如果WeakReference只跟踪对象本身,它就可以工作。解决这个问题的办法并不简单。看。哦,我以为你说WeakReference类本身有一个bug,这会让人吃惊。修改了答案-是Laurent的
WeakAction
实现导致了这个问题。谢谢。接受并修复了一个打字错误:)