【问题标题】:Lost DataContext when navigating back in Frame (SplitView) in UWP在 UWP 中返回 Frame (SplitView) 时丢失 DataContext
【发布时间】:2016-04-10 15:49:32
【问题描述】:

我正在使用带有导航框架的 SplitView 在 C# 中为 Windows 10 编写通用应用程序。 我有一个带有动态加载列表的侧边栏,当我单击其中一个项目时,我会使用菜单中的模型导航到一个页面,以指示我应该在框架中加载哪个项目。

我关注了这个示例:Windows-universal-samples/Samples/XamlNavigation/

唯一的区别是,每次我选择具有特定 ViewModel 的不同项目时,我只加载一个页面,而不是多个页面。我使用 Autofac 加载 ViewModels 和 MyFrame.Navigate(typeof(DetailsPage), idOfItem); 加载页面。

问题是,每次我导航到下一页时,前一个页面的实例似乎都丢失了,当我返回时,它会加载一个新实例。当我在 RootFrame 中导航时,这种事情似乎不会发生,而在 Windows Phone 8.1 中也没有发生。

我已经在网上搜索了几个小时的解决方案,但找不到任何相关信息。

有谁知道为什么会发生这种情况? 我希望我的问题足够清楚。

提前感谢您的回答。

【问题讨论】:

    标签: c# mvvm uwp windows-10-universal


    【解决方案1】:

    您观察到的行为是正确的并且符合预期。你有两个选择:

    您可以使用Page.NavigationCacheMode,将其设置为Required。这很简单,但可能会消耗大量内存。

    或者您可以将页面状态保存在OnNavigatedFrom 并在OnNavigatedTo 中恢复它。事实上,根据您的情况,甚至可能不需要在 OnNavigatedFrom 中保存状态,假设返回页面时可以按照与第一次进入页面时构建它的方式相同的方式构建状态(您的 DataContext)。

    【讨论】:

    • 我试过 NavigationCacheMode,没用,当第二次导航并返回时,实例保持不变,而不是前一个。你的意思是每次我离开时都会墓碑化页面?我不知道,再次重新加载DataContext似乎有点太痛苦了,但如果这是唯一的方法......
    • 如果重新加载 DataContext “太痛苦”,您可能需要考虑缓存它。但是当然你的缓存应该独立于页面实例,否则它会随着页面消失。但请注意,没有策略(或错误策略)的缓存是内存泄漏的另一个名称。
    • 顺便说一句,“thombstoning”是 Windows Phone 7 的术语,不再经常使用。但是,是的,这基本上是我的建议。
    • 好吧,我就是不知道怎么在W10上保存页面的状态,和WP8一样吗?
    猜你喜欢
    • 2020-01-23
    • 1970-01-01
    • 1970-01-01
    • 2010-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多