![](/img/trans.png)
[英]Using single View for multiple ViewModels with Caliburn.Micro on Windows Phone 8.1
[英]Caliburn.Micro 2.0 and navigating back in Windows Phone 8.1 XAML
假设我的页面层次结构是
AViewModel-> BViewModel
在每一个视图模型(注册为PerRequest)我从服务器中加载数据OnActivate
方法,并设置数据装入一个标志(布尔私有类变量)。
在Windows Phone 8和Windows Phone 8.1 Silverlight中,当用户从BViewModel导航到AViewModel时,然后在OnActivate中,ViewModel知道数据已经加载(标志为true),并且不执行任何操作。
这在Windows Phone 8.1中不起作用,因为每次用户向后导航时,都会再次创建ViewModel(我可以看到构造函数调用)。
当我设置NavigationCacheMode=NavigationCacheMode.Required;
在所有视图中,该标志在反向导航中均有效。 此解决方案的问题是,当我从BViewModel导航回到AViewModel时,该标记仍然存在,因此不会再次加载数据(没关系),但是当我然后导航至BViewModel(使用不同的参数)时,则什么都不会发生,因为BViewModel未被销毁,而是被重用,并带有标志,表明不需要加载数据。
有没有办法使其表现与Windows Phone 8(或8.1 Silverlight)完全相同
看起来此问题的关键是要知道是否通过向后导航(使用“后退”按钮)激活了页面(ViewModel)。 我想出了一个似乎可行但不太优雅的解决方案。
我创建了App类一个布尔值属性
public bool IsBackNavigation { get; private set; }
我在框架s
导航”事件中设置的
frame.Navigating += (s, e) => IsBackNavigation = e.NavigationMode == NavigationMode.Back;
然后,ViewModel可以按以下方式访问它
(App.Current as App).IsBackNavigation
此解决方案似乎可以与NavigationCacheMode=NavigationCacheMode.Required
(或NavigationCacheMode=NavigationCacheMode.Enabled
)一起使用。
但是,我有点担心自动缓存,因此最好采用与Windows Phone 8具有相同功能的框架解决方案。
Github上对此问题进行了讨论: https : //github.com/Caliburn-Micro/Caliburn.Micro/issues/51
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.