代码之家  ›  专栏  ›  技术社区  ›  Jason

MVVM Light Messenger多次执行

  •  3
  • Jason  · 技术社区  · 15 年前

    我使用MVVM Light,并使用消息在ViewModels之间进行通信,以让ViewModel知道何时可以执行某些操作。我的问题是,我注册了一条消息,然后它多次接收它。所以为了避免我的程序执行一次以上的东西,我必须创建布尔标志,看看它是否已经被接收。你知道它为什么这么做吗?我怎么才能阻止它?

    5 回复  |  直到 15 年前
        1
  •  8
  •   BenMorel Manish Pradhan    12 年前

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

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

    对于视图(控件、窗口或类似视图),请调用信使。注销在视图拆分时发生的事件,例如卸载的事件。

    这是MVVM的一个已知行为,已经在几个地方进行了讨论。

        2
  •  6
  •   jcgalveza    13 年前

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

    static bool isRegistered = false;

    然后,在构造函数中:

    if( !isRegistered )
    {
       Messenger.Default.Register<MyMessage>(this, OnMessageReceived);
       isRegisterd = true;
    }
    
        3
  •  1
  •   dnndeveloper    15 年前

    我以前见过这个问题。这和信使默认注册不止一次被打电话。MVVMLight Messenger类将注册相同的项目“x”次。这就是为什么当你打电话给送信人时,你会收到很多次。

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

        4
  •  1
  •   Jason    12 年前

    真的很老了,但我想我会回答,以防有人需要它。当时我对silverlight还不太熟悉,问题最终是内存泄漏,因为viewModel有多个实例,仍然在内存中。

        5
  •  0
  •   usefulBee    8 年前

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

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