MVVM Light Messenger多次执行

时间:2010-09-13 15:55:34

标签: mvvm-light

我正在使用MVVM Light并使用Message在ViewModel之间进行通信,让ViewModel知道何时可以执行某些操作。我的问题是我注册了一条消息,然后它多次收到它。所以为了防止我的程序多次执行某些事情,我必须创建一个布尔标志来查看它是否已被收到。知道为什么会这样做以及如何阻止它?

5 个答案:

答案 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">