如何将多个视图的 DataContext 设置为一个 ViewModel 实例
How to set a DataContext of multiple Views to one instance of ViewModel
我正在为我的视图使用 ViewModelLocator,它是在 Bootstrapper 中使用以下方法配置的:
protected override void ConfigureViewModelLocator()
{
base.ConfigureViewModelLocator();
ViewModelLocationProvider.Register<ViewA, ViewABViewModel>();
ViewModelLocationProvider.Register<ViewB, ViewABViewModel>();
}
它工作正常,但为我的 2 个视图创建了两个单独的 ViewModel 实例。
我希望我的两个视图都使用相同的 ViewModel 实例。
检查 source code 显示默认情况下为每个视图创建新实例的问题:
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 现在使用这个实例,而不是创建一个新实例。
您可以将视图模型注册为单例:
protected override void ConfigureViewModelLocator()
{
base.ConfigureViewModelLocator();
Container.RegisterType<ViewAViewModel>(new ContainerControlledLifetimeManager()); //<--
ViewModelLocationProvider.Register<ViewA, ViewABViewModel>();
ViewModelLocationProvider.Register<ViewB, ViewABViewModel>();
}
或者按照@Fruchtzwerg 的建议使用接受工厂的方法重载。
我正在为我的视图使用 ViewModelLocator,它是在 Bootstrapper 中使用以下方法配置的:
protected override void ConfigureViewModelLocator()
{
base.ConfigureViewModelLocator();
ViewModelLocationProvider.Register<ViewA, ViewABViewModel>();
ViewModelLocationProvider.Register<ViewB, ViewABViewModel>();
}
它工作正常,但为我的 2 个视图创建了两个单独的 ViewModel 实例。 我希望我的两个视图都使用相同的 ViewModel 实例。
检查 source code 显示默认情况下为每个视图创建新实例的问题:
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 现在使用这个实例,而不是创建一个新实例。
您可以将视图模型注册为单例:
protected override void ConfigureViewModelLocator()
{
base.ConfigureViewModelLocator();
Container.RegisterType<ViewAViewModel>(new ContainerControlledLifetimeManager()); //<--
ViewModelLocationProvider.Register<ViewA, ViewABViewModel>();
ViewModelLocationProvider.Register<ViewB, ViewABViewModel>();
}
或者按照@Fruchtzwerg 的建议使用接受工厂的方法重载。