这份原稿.micro2.0和导航回到Windows Phone 8.1 XAML

本文关键字:Windows Phone XAML 导航 micro2 | 更新日期: 2023-09-27 18:08:44

假设我的页面层次结构是

AViewModel -> BViewModel

在每个ViewModel(注册为PerRequest)中,我在OnActivate方法中从服务器加载数据,并设置数据加载的标志(私有bool类变量)。

在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)

这份原稿.micro2.0和导航回到Windows Phone 8.1 XAML

看起来这个问题的关键是知道页面(ViewModel)是否通过返回(使用返回按钮)被激活。我想到了一个解决方案,似乎有效,但不是很优雅。

我在App类 上创建了一个bool属性
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