我正在使用MVVM Light并使用Message在ViewModel之间进行通信,让ViewModel知道何时可以执行某些操作。我的问题是我注册了一条消息,然后它多次收到它。所以为了防止我的程序多次执行某些事情,我必须创建一个布尔标志来查看它是否已被收到。知道为什么会这样做以及如何阻止它?
答案 0 :(得分:8)
确保在不再需要消息处理程序后取消注册消息处理程序。 Messenger保留对已注册方法的引用,这可以防止它们被垃圾回收。
因此,对于ViewModels:确保在完成后调用Cleanup(或实现IDisposable并从那里调用Cleanup)。
对于视图(控件,Windows或类似视图),在视图拆解时发生的事件中调用Messenger.Unregister,例如卸载事件。
这是MVVM的一种已知行为,已在多个地方进行了讨论。
答案 1 :(得分:6)
很老的问题,但我通过这样做解决了这个问题:
static bool isRegistered = false;
然后,在构造函数中:
if( !isRegistered )
{
Messenger.Default.Register<MyMessage>(this, OnMessageReceived);
isRegisterd = true;
}
答案 2 :(得分:1)
我以前见过这个问题。它与Messenger.Default.Register不止一次被调用有关。 MVVMLight Messenger类将注册相同的项目“x”次。这就是为什么当你打电话给发送你多次得到它。
任何人都知道如何防止MVVMLight多次注册?
答案 3 :(得分:1)
真的很老但我想我会回答以防有人需要它。我当时对于Silverlight来说还是比较新的,因为具有多个实例的viewModel仍在内存中,因此问题最终成为内存泄漏。
答案 4 :(得分:0)
正如其他提到者所提到的,同一条消息正在多次注册。我注意到在导航到View X然后导航回View Z时发生了这种情况,其中消息在Z ViewModel的构造函数中注册。一种解决方案是将NavigationCacheMode属性设置为Required
<Page
........
........
NavigationCacheMode="Required">