繁体   English   中英

Caliburn.Micro 2.0并在Windows Phone 8.1 XAML中导航

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM