0

我正在为 UWP 应用程序使用 Prism v6.3.0。我正在为 DI 使用 Unity Container。出现以下问题:每当我的应用程序导航到给定视图(例如 MainPage)时,似乎都会创建相应 ViewModel 的新实例。我想重用同一个虚拟机(基本上,只创建一次)。
我有:prismMvvm:ViewModelLocator.AutoWireViewModel="True"在所有页面的 XAML 中。
我的代码从不直接调用任何 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());
}

有什么提示吗?

4

1 回答 1

0

由于没有人回答,我再次尝试自己弄清楚。现在,我知道最好的方法可能是修改 Prism 使用的容器,以便将所有 VM 注册为单例。因为这听起来对于这个问题来说工作量太大,所以我选择先看看这个ViewModelLocationProvider类。PRISM使用ViewModelLocationProvider它来查找给定视图(将 AutoWireViewModel 设置为 true)的 VM,并将找到的 VM 类型注入给定视图的 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;
        }));
        
    }
于 2020-08-19T05:40:45.730 回答