我正在使用MVVM Light,并使用消息在ViewModels之间进行通信,以让ViewModel知道什么时候可以执行某些操作。我的问题是我注册了一条消息,然后多次收到它。所以为了防止我的程序执行一些操作,我不得不创建布尔标志来查看它是否已经被接收。任何想法为什么这样做,我怎么能阻止它?MVVM Light Messenger执行多次
回答
我以前看过这个问题。它必须与被称为不止一次的Messenger.Default.Register相关。 MVVMLight Messenger类将注册相同的项目'x'次数。这就是为什么当你打电话给发送你多次。
任何人都知道如何防止MVVMLight注册多次?
我发现我的问题,至少是因为其他视图模型和视图在记忆中。我仍然有一个问题,我需要从虚拟机发送消息到一个视图。我现在的问题是,此视图的所有以前的实例仍然在内存中,因此消息被发送和接收多次 – Jason 2010-12-14 14:27:07
确保在您不再需要它们时取消注册您的消息处理程序。信使保留对已注册方法的引用,这可以防止垃圾收集。
因此,对于ViewModels:确保在完成之后调用Cleanup(或者实现IDisposable并从那里调用Cleanup)。
对于视图(控件,Windows或类似),在视图的拆解发生的事件中调用Messenger.Unregister,例如, Unloaded事件。
这是MVVM的已知行为,并已在几个地方进行了讨论。
...除了在WPF中,UserControl.Unloaded事件不保证被触发,按照http:/ /connect.microsoft.com/VisualStudio/feedback/details/575287/the-usercontrol-unloaded-event-is-not-raised-when-the-mainwindow-gets-closed - 因此并不那么容易。 – 2014-01-23 15:27:32
我正在做的一点是你必须清理Messenger,否则,它将继续处理消息,尽管它不应该这样做。 Unloaded事件是一个地方,但它可能不是唯一的或最好的。 – AxelEckenberger 2014-01-23 16:01:22
很老的问题,但我做这个解决了这个问题:
static bool isRegistered = false;
,然后,在构造函数中:
if(!isRegistered)
{
Messenger.Default.Register<MyMessage>(this, OnMessageReceived);
isRegisterd = true;
}
这是问题的可能修复方法,不要在构造函数中注册Messenger。 – 2013-05-07 14:02:04
真的老了,但想到我会在万一有人只是回答需要它。那时我对silverlight还是比较陌生的,这个问题最终成为内存泄漏,因为具有多个实例的viewModel仍然在内存中。
正如其他贡献者所说,同一条消息正在多次注册。我注意到这个行为发生在导航到View X的时候,然后导航回到View Z,其中消息在Z ViewModel的构造函数中被注册。一种解决方案是将NavigationCacheMode属性设置为必需
<Page
........
........
NavigationCacheMode="Required">
- 1. MVVM light Messenger第一次执行后执行操作Windows Uinversal 8.1
- 2. MVVM Light Messenger类
- 3. WPF MVVM Light Messenger和Prism EventAggregator
- 4. MVVM light toolkit messenger问题
- 5. MVVM Light Messenger接收方法
- 6. 当执行RelayCommand时发送单元测试MVVM Light Messenger消息
- 7. MVVM Light Messenger有什么好处?
- 8. 使用接口与MVVM light Messenger进行数据请求
- 9. MVVM Light Silverlight问题
- 10. 使用MVVM/MVVM-Light编辑记录
- 11. MVVM Light Messeging问题
- 12. mvvm light messenger检查课程是否已经注册?
- 13. 这是使用MVVM Light Messenger类的正确方法
- 14. MVVM Light Messenger - 你如何测试有针对性的消息?
- 15. '在这个上下文中不存在Messenger类' - MVVM Light
- 16. mvvm light - messaging
- 17. MVVM Light太快:)
- 18. MVVM Light - PivotControl
- 19. MVVM Light Binding
- 20. mvvm light wpf unregister
- 21. MVVM Light Messaging
- 22. MVVM Light Messaging问题
- 23. Mvvm Light ViewModel With ViewModel
- 24. 在MVVM Light中投射CommandParameterValue
- 25. MVVM Light - 使用ViewModelLocator - 属性命中多次
- 26. MVVM Light Toolkit示例
- 27. MVVM Light RelayCommand参数
- 28. MVVM Light + Unity还是Prism?
- 29. MVVM Light - 继续执行RelayCommand实例的CanExecute方法始终执行
- 30. MVVM Light多个数据上下文
您的消息在哪里发送?您是否已经通过MVVM Light来源了解了邮件被多次发送的原因?在你的问题得到解答之前,你可以做一定量的工作,或者提供更多的细节。 – 2010-09-14 16:50:15