我正在使用MVVM Light,并使用消息在ViewModel之间进行通信,以让一个ViewModel知道何时可以执行某些操作。我的问题是,我注册了一条消息,然后它会多次接收到它。为了防止程序执行多次操作,我必须创建布尔标志来查看它是否已经被接收过了。您有什么想法,为什么会这样,并且如何停止它?
我正在使用MVVM Light,并使用消息在ViewModel之间进行通信,以让一个ViewModel知道何时可以执行某些操作。我的问题是,我注册了一条消息,然后它会多次接收到它。为了防止程序执行多次操作,我必须创建布尔标志来查看它是否已经被接收过了。您有什么想法,为什么会这样,并且如何停止它?
Messenger.Default.Unregister(this)
- 取消注册与 this
相关联的所有消息。 - AxelEckenberger这是一个很老的问题,但我通过以下方法解决了它:
static bool isRegistered = false;
然后,在构造函数中:
if( !isRegistered )
{
Messenger.Default.Register<MyMessage>(this, OnMessageReceived);
isRegisterd = true;
}
虽然我很老了,但我还是想回答一下,以防有人需要。当时我对Silverlight还比较陌生,问题最终被确定为内存泄漏,因为ViewModel仍然在内存中存在多个实例。
正如其他贡献者所提到的,同一条消息被注册了多次。我注意到这种行为发生在导航到视图X然后返回到视图Z时,在Z ViewModel的构造函数中注册了该消息。一个解决方案是将NavigationCacheMode属性设置为Required
<Page
........
........
NavigationCacheMode="Required">