MVVM Light Messenger多次执行

Jas*_*son 4 mvvm-light

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

Axe*_*ger 8

一旦不再需要,请确保取消注册消息处理程序.Messenger保留对已注册方法的引用,这可以防止它们被垃圾回收.

因此,对于ViewModels:确保在完成后调用Cleanup(或实现IDisposable并从那里调用Cleanup).

对于视图(控件,Windows或类似),在视图拆除时发生的事件中调用Messenger.Unregister,例如Unloaded事件.

这是MVVM的已知行为,并已在多个地方进行了讨论.


jcg*_*eza 6

很老的问题,但我通过这样做解决了这个问题:

static bool isRegistered = false;

然后,在构造函数中:

if( !isRegistered )
{
   Messenger.Default.Register<MyMessage>(this, OnMessageReceived);
   isRegisterd = true;
}
Run Code Online (Sandbox Code Playgroud)


dnn*_*per 1

我以前见过这个问题。这与 Messenger.Default.Register 被多次调用有关。MVVMLight Messenger 类将注册相同的项目“x”次。这就是为什么当您调用 Send 时会多次收到它。

有人知道如何防止 MVVMLight 多次注册吗?