C# 在UWP中返回帧(拆分视图)时丢失DataContext

C# 在UWP中返回帧(拆分视图)时丢失DataContext,c#,mvvm,uwp,windows-10-universal,C#,Mvvm,Uwp,Windows 10 Universal,我正在用C#为Windows 10编写一个通用应用程序,使用带有导航框架的SplitView。 我有一个侧边栏,上面有一个动态加载的列表,当我单击其中一个项目时,我会从菜单中使用模型导航到一个页面,以指示应该在框架中加载哪个项目 我遵循了这个样本: 唯一的区别是,每次选择具有特定ViewModel的不同项目时,我只有一个页面,而不是有多个页面。我使用Autofac加载ViewModels和MyFrame.Navigate(typeof(DetailsPage),idOfItem)以加载页面 问题

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

我遵循了这个样本:

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

问题是,每次我导航到下一页时,上一页的实例似乎都丢失了,当我返回时,它会加载一个新实例。当我在根框架中导航时,这种情况似乎不会发生,在WindowsPhone8.1中也不会发生

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

有人知道为什么会这样吗? 我希望我的问题足够清楚


提前感谢您的回答。

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

您可以使用,将其设置为
Required
。这很容易,但可能会消耗大量内存


或者,您可以在中保存页面状态,并在中恢复页面状态。事实上,根据您的场景,甚至可能不需要在OnNavigatedFrom中保存状态,假设在返回页面时可以以与第一次提交页面时相同的方式构造状态(您的DataContext)。

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

您可以使用,将其设置为
Required
。这很容易,但可能会消耗大量内存


或者,您可以在中保存页面状态,并在中恢复页面状态。事实上,根据您的场景,甚至可能不需要在OnNavigatedFrom中保存状态,假设状态(您的DataContext)可以在返回页面时以与第一次提交页面时相同的方式进行构造。

我尝试了NavigationCacheMode,但不起作用,当一个实例第二次导航并返回时,该实例保持不变,而不是前一个实例。你的意思是每次我离开的时候都要在页面上刻上墓碑?我不知道,重新加载DataContext似乎有点太痛苦了,但如果这是唯一的方法……如果重新加载DataContext“太痛苦”,您可能必须考虑缓存它。当然,缓存应该独立于页面实例,否则它将随页面一起消失。但要小心,没有策略(或坏策略)的缓存是内存泄漏的另一个名称。顺便说一句,“汤姆斯汀”是WindowsPhone7的术语,不再经常使用。但是,是的,这基本上就是我的建议。好吧,我只是不确定如何在W10上保存页面的状态,它是否与WP8相同?我尝试了NavigationCacheMode,但没有工作,当第二次导航并返回时,实例保持不变,而不是前一次。你的意思是每次我离开的时候都要在页面上刻上墓碑?我不知道,重新加载DataContext似乎有点太痛苦了,但如果这是唯一的方法……如果重新加载DataContext“太痛苦”,您可能必须考虑缓存它。当然,缓存应该独立于页面实例,否则它将随页面一起消失。但要小心,没有策略的缓存(或不好的缓存)是内存泄漏的另一个名称。顺便说一句,“thombsting”是Windows Phone 7的术语,不再经常使用。但是,是的,这基本上就是我建议的。好吧,我只是不确定如何在W10上保存页面状态,它与WP8相同吗?