Mvvm 如何在导航回视图时不重新实例化视图的datacontext(因此不再调用VM构造函数)

Mvvm 如何在导航回视图时不重新实例化视图的datacontext(因此不再调用VM构造函数),mvvm,uwp,Mvvm,Uwp,所以我有两种观点。我执行view1中的操作,数据被绑定。当我点击按钮进入view2时,我会做我要做的事情并返回view1。当然,在view1中,代码隐藏InitializeComponent()并设置视图的DataContextDataContext=IocContainer.StaticContainer.Resolve() 因此,每次我返回到view1时,都会调用viewModel的构造函数并创建新对象(因此我会丢失一些数据)。如何在导航时不调用conscructor返回到view1或不再次

所以我有两种观点。我执行view1中的操作,数据被绑定。当我点击按钮进入view2时,我会做我要做的事情并返回view1。当然,在view1中,代码隐藏
InitializeComponent()
并设置视图的DataContext
DataContext=IocContainer.StaticContainer.Resolve()


因此,每次我返回到view1时,都会调用viewModel的构造函数并创建新对象(因此我会丢失一些数据)。如何在导航时不调用conscructor返回到view1或不再次初始化新对象?

如果您想在导航期间保持页面的状态,则需要设置page.NavigationCacheMode。这将在内存中保留上一个实例,并在您导航回它时使用它

默认情况下,在UWP中,当您转到下一页时,导航始终丢弃当前页。返回时,它将重新创建整个页面,包括该页面所需的数据上下文和任何其他数据元素。它做到了这一点,并保持内存使用率低

要小心,因为保存在内存中的每个页面都会占用应用程序中更多的内存

在构造函数中执行此操作的代码:

public MyPage()
{
    // Page cached if the cache size of the parent Frame is large enough
    NavigationCacheMode = NavigationCacheMode.Enabled;

    // Or, page is always cached
    NavigationCacheMode = NavigationCacheMode.Required;
}

如果要在导航期间保持页面的状态,则需要设置page.NavigationCacheMode。这将在内存中保留上一个实例,并在您导航回它时使用它

默认情况下,在UWP中,当您转到下一页时,导航始终丢弃当前页。返回时,它将重新创建整个页面,包括该页面所需的数据上下文和任何其他数据元素。它做到了这一点,并保持内存使用率低

要小心,因为保存在内存中的每个页面都会占用应用程序中更多的内存

在构造函数中执行此操作的代码:

public MyPage()
{
    // Page cached if the cache size of the parent Frame is large enough
    NavigationCacheMode = NavigationCacheMode.Enabled;

    // Or, page is always cached
    NavigationCacheMode = NavigationCacheMode.Required;
}

你在用什么?@FlorianMoser Unity,它的数据上下文丢失了。你在用什么?@FlorianMoser Unity,它的数据上下文丢失了。谢谢,它在我的机器上工作:)。所以这对wpf来说不是问题,对吗?wpf有一种不同的机制来保持内存中的页面。我相信是Page.KeepAlive属性。。。但这也取决于您使用的框架以及它如何实现向后/向前行为。谢谢,它在我的机器上工作:)。所以这对wpf来说不是问题,对吗?wpf有一种不同的机制来保持内存中的页面。我相信是Page.KeepAlive属性。。。但这也取决于您使用的框架以及它如何实现后退/前进行为。