【问题标题】:MVVM Light Messenger executing multiple timesMVVM Light Messenger 多次执行
【发布时间】:2010-09-13 15:55:34
【问题描述】:

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

【问题讨论】:

  • 您的消息被发送到哪里?您是否已通过 MVVM 光源来找出消息被多次发送的原因?在回答您的问题之前,您可以做一些工作或提供更多细节。

标签: mvvm-light


【解决方案1】:

确保在不再需要消息处理程序时取消注册它们。 Messenger 保留对已注册方法的引用,这样可以防止它们被垃圾收集。

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

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

这是 MVVM 的已知行为,已在多个地方讨论过。

【讨论】:

  • ... 除了在 WPF 中,根据connect.microsoft.com/VisualStudio/feedback/details/575287/…,不保证会触发 UserControl.Unloaded 事件 - 所以这并不容易。
  • 我的意思是你必须在 Messenger 后面进行清理,否则它会继续处理消息,尽管它不应该再这样做了。 Unloaded 活动是一个地方,但它可能不是唯一的或最好的。
  • 注销示例代码 - Messenger.Default.Unregister> (this, NotificationReceivedWithTemplateSelection);
  • 更简单:Messenger.Default.Unregister(this) - 取消所有与 this 关联的消息。
【解决方案2】:

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

static bool isRegistered = false;

然后,在构造函数中:

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

【讨论】:

  • 这可能是解决问题的方法,不要在构造函数中注册 Messenger。
  • 虽然这可以防止重复注册,但并不能确保消息被正确的实例处理。或者一个实例没有通过注册保持活动状态。
【解决方案3】:

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

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

【讨论】:

  • 我发现我的问题至少是因为其他视图模型和视图在内存中徘徊。我仍然有一个问题,我需要从 vm 向视图发送消息。我现在的问题是该视图的所有先前实例仍在内存中,因此消息被多次发送和接收
【解决方案4】:

真的很老,但我想我会回答以防万一有人需要它。当时我对 silverlight 还很陌生,问题最终是内存泄漏,因为具有多个实例的 viewModel 仍在内存中。

【讨论】:

    【解决方案5】:

    正如其他贡献者所提到的,同一条消息被多次注册。我注意到在导航到 View X 然后导航回 View Z 时发生了这种行为,在 Z ViewModel 的构造函数中注册了消息。一种解决方案是将NavigationCacheMode 属性设置为必需

    <Page
      ........
      ........
      NavigationCacheMode="Required">
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-16
      • 2016-02-07
      • 2011-07-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多