1

我正在为我的视图使用 ViewModelLocator,它在 Bootstrapper 中使用以下方法进行配置:

protected override void ConfigureViewModelLocator()
{
    base.ConfigureViewModelLocator();

    ViewModelLocationProvider.Register<ViewA, ViewABViewModel>();
    ViewModelLocationProvider.Register<ViewB, ViewABViewModel>();
}

它工作正常,但为我的 2 个视图创建了两个单独的 ViewModel 实例。我希望我的两个视图都使用相同的 ViewModel 实例。

4

2 回答 2

1

您可以将视图模型注册为单例:

protected override void ConfigureViewModelLocator()
{
    base.ConfigureViewModelLocator();

    Container.RegisterType<ViewAViewModel>(new ContainerControlledLifetimeManager()); //<--
    ViewModelLocationProvider.Register<ViewA, ViewABViewModel>();
    ViewModelLocationProvider.Register<ViewB, ViewABViewModel>();
}

或者使用@Fruchtzwerg 建议的接受工厂的方法重载。

于 2017-08-24T15:33:47.017 回答
1

检查源代码显示默认为每个视图创建一个新实例的问题:

static Func<Type, object> _defaultViewModelFactory = type => Activator.CreateInstance(type);

Prism 允许为所有类型或仅特殊类型定义此方法。应该首选第二种情况。

ViewModelLocationProvider.Register<ViewA, ViewABViewModel>();

仅将 View 和 ViewModel 的类型链接在一起,没有定义工厂。这意味着为每个视图创建一个新实例。要在多个视图中使用实例,您需要定义工厂方法。创建一个 ViewModel 实例

ViewABViewModel vm = new ViewABViewModel();

并通过返回这个已经准备好的实例为您的视图注册工厂方法

ViewModelLocationProvider.Register<ViewA>(() => vm);
ViewModelLocationProvider.Register<ViewB>(() => vm);

Prism 现在采用这个实例而不是创建一个新实例。

于 2017-08-23T20:33:55.720 回答