我正在使用构建跨平台移动应用程序MvvmCross
框架。
由于我想在 ViewModel 之间共享信息,因此我使用内置的方法在 ViewModel 的构造函数内注册通知MvxMessenger
.
我们假设一条消息名为ShowAdsMsg
,然后 ViewModel 如下所示:
public class AdsViewModel : BaseLookersViewModel, IAdsViewModel
{
private MvxSubscriptionToken _showAdsMsgToken;
public AdsViewModel()
{
_showAdsMsgToken = MvxMessenger.Subscribe<ShowAdsMsg>(message => onShowAdsNavigation(), MvxReference.Weak);
MyMessenger.PublishLastMessage();
}
private void onShowAdsNavigation()
{
//Do Stuff
}
}
有关MyMessenger
thing:
到 ViewModel 的实际导航是从MainViewModel
.
因为在导航本身的那一刻AdsViewModel
尚不存在,消息发布自MainViewModel
无法到达它。
所以,我的想法是天真地“记住”该消息并在新的 ViewModel 准备就绪时发布它。
所以现在导航调用来自MainViewModel
看起来像这样:
private void navigate()
{
MyMessenger.RememberMessage(new ShowAdsMsg(this));
ShowViewModel<AdsViewModel>( );
}
我现在可以导航到 ViewModel,并且所有通知均已成功捕获。
然而...
当我按下设备上的“后退”按钮并重新导航到同一个 ViewModel 时,
构造函数被再次调用,因此消息订阅重新发生。
结果,当消息到达时onShowAdsNavigation()
处理程序被解雇两次!
I found this类似的帖子,讨论如何正确处理 ViewModel 的问题,
但它不包含对我的问题的直接解决方案。
我需要的是一个解决方案。它可以是以下之一:
- 想法如何不订阅 ViewModel 的 ctor 上的消息。
- 有关如何以及何时正确处置 ViewModel 的指南。
- 解释为什么再次调用构造函数以及如何避免这种情况。
- 一种完全不同的 ViewModel 信息传递方法。
预先感谢您的帮助!
编辑:
我发现thisSO Answer,基本上回答了上面列表中的第 3 项。
不过,我想知道对于信使问题我应该采取什么方法。
另一个编辑:
我验证了 MvvmCross 教程中存在相同的行为N-05-多页。我只是向 SecondViewModel 添加了一个 ctor,并在每次 BACK+Renavigate 之后在其中点击了一个断点。