PRISM是否根据每个导航请求创建新的ViewModel?

问题描述

我正在将Prism v6.3.0用于UWP应用。我正在使用Unity Container for DI。 发生以下问题:每当我的应用导航到给定的视图(例如MainPage)时,似乎都会创建相应viewmodel的新实例。我想重用相同的VM(基本上只有一次创建)。
我在所有页面的XAML中都拥有prismMvvm:viewmodelLocator.AutoWireviewmodel="True"
我的代码从不直接调用任何VM构造函数,因此不能那样做。我也只在ConfigureContainer覆盖中注册服务。

我尝试过的是在App.xaml.cs中注册视图(似乎没有什么不同):

private void RegisterViews()
{
        Container.RegisterInstance(new LoginPage(),new ContainerControlledLifetimeManager());
        Container.RegisterInstance(new SettingsPage(),new ContainerControlledLifetimeManager());
        Container.RegisterInstance(new MainPage(),new ContainerControlledLifetimeManager());
}

有任何提示吗?

解决方法

由于没有人回答,我尝试再次自行解决。 现在,我知道最好的解决方法是修改Prism使用的容器,以便将所有VM注册为单例。因为这听起来像是解决该问题的工作量太大,所以我选择首先看看ViewModelLocationProvider类。 PRISM使用ViewModelLocationProvider来查找给定View(将AutoWireViewModel设置为true)的VM,并将找到的VM类型注入给定View的DataContext中。

我尝试为给定的视图设计一个工厂,该视图将确保仅创建一个VM实例并找到以下解决方案:

protected override void ConfigureViewModelLocator()
    {
        base.ConfigureViewModelLocator();
        ViewModelLocationProvider.Register<MainPage>((delegate
        {
            var vm = Container.Resolve<MainViewModel>();
            if (Container.Registrations.All(r => r.RegisteredType != typeof(MainViewModel)))
                Container.RegisterInstance<MainViewModel>(vm,new ContainerControlledLifetimeManager());
            return vm;
        }));

        ViewModelLocationProvider.Register<SettingsPage>((delegate
        {
            var vm = Container.Resolve<SettingsViewModel>();
            if (Container.Registrations.All(r => r.RegisteredType != typeof(SettingsViewModel)))
                Container.RegisterInstance<SettingsViewModel>(vm,new ContainerControlledLifetimeManager());
            return vm;
        }));
        
    }