这份原稿.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)
看起来这个问题的关键是知道页面(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