当前位置: 首页 > 编程语言 > C#

导航的时候又调用了ViewModel的构造函数,所以又订阅了Messenger分享

时间:2023-04-10 21:43:26 C#

导航的时候又调用了ViewModel的构造函数,所以又订阅了Messenger订阅我正在使用MvvmCross框架构建跨平台移动应用。因为我想在ViewModel之间共享信息,所以我使用内置的MvxMessenger在ViewModel的构造函数中注册通知。让我们假设一条名为ShowAdsMsg的消息,然后ViewModel看起来像这样:publicAdsViewModel(){_showAdsMsgToken=MvxMessenger.Subscribe(message=>onWShowAdsNavigation,Reference();MyMessenger.PublishLastMessage();}privatevoidonShowAdsNavigation(){//DoStuff}}关于MyMessenger的一些事情:ViewModel的实际导航是从MainViewModel执行。由于AdsViewModel在导航本身时尚不存在,因此从MainViewModel发布的消息无法到达它。所以,我的想法是天真地“记住”消息并在新消息出现时发布它ViewModel已准备就绪。所以现在来自MainViewModel的导航调用如下所示:privatevoidnavigate(){MyMessenger.RememberMessage(newShowAdsMsg(this));ShowViewModel();}已成功捕获。但是...当我按下设备上的“返回”按钮并重新导航到同一个ViewModel时,再次调用构造函数,因此消息订阅重新发生。所以当消息到达时,onShowAdsNavigation()处理程序被触发两次!我发现这篇类似的文章讨论了如何正确处理ViewModel,但它不包含对我的问题的直接解决方案。我需要的是一个解决方案。它可以是以下之一:想法如何不订阅ViewModel的ctor上的消息。关于如何以及何时正确处理ViewModel的指南。解释为什么再次调用构造函数,以及如何避免这种情况。完全不同的ViewModel信息消息传递方法。在此先感谢您的帮助!编辑:我找到了这个SOanswer,它基本上回答了上面列表中的第3项。但是,我想知道我应该采取什么方法来处理Messenger问题。另一个编辑:我验证了MvvmCross教程N-05-MultiPage中存在相同的行为。我刚刚向SecondViewModel添加了一个ctor,并在每次BACK+Renavigate之后在其中放置了一个断点。解释为什么再次调用构造函数,以及如何避免这种情况。ctor不会在同一个对象上被调用两次——而是每次都会创建一个新的View和一个新的ViewModel。默认情况下,我希望在每个平台上的每个前向导航中创建一个新的ViewModel。默认情况下,我不希望在WindowsPhone上的后退按钮期间发生这种情况-对于我的测试用例,这不会发生-但如果出现以下情况则可能发生:没有看到任何更多代码,我无法再猜测为什么会发生这种情况.就我个人而言,我建议深入了解为什么您会在返回期间看到创建新的ViewModel,但如果您只是想快速修复,那么您可以查看覆盖MvvmCross中的ViewModelLocator-请参阅MvvmCross:DoesShowViewModelalwaysconstructnewinstances?请注意,在WindowsStore上,我预计会发生这种情况-默认情况下,WindowsStore不会从内存中的Backstack中保存页面-但您可以通过设置NavigationCacheMode=NavigationCacheMode.Enabled;来覆盖它NavigationCacheMode=NavigationCacheMode.Enabled;如果你需要。以上是C#学习教程:导航的时候又调用了ViewModel的构造函数,所以又订阅了信使订阅,分享了所有的内容。如果对大家有用,需要进一步了解C#学习教程,还望大家多加关注~本文整理自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: