C# 如何将多个视图的DataContext设置为ViewModel的一个实例

C# 如何将多个视图的DataContext设置为ViewModel的一个实例,c#,wpf,mvvm,prism-6,C#,Wpf,Mvvm,Prism 6,我正在为视图使用ViewModelLocator,它在引导程序中使用以下方法配置: protected override void ConfigureViewModelLocator() { base.ConfigureViewModelLocator(); ViewModelLocationProvider.Register<ViewA, ViewABViewModel>(); ViewModelLocationProvider.Register<V

我正在为视图使用ViewModelLocator,它在引导程序中使用以下方法配置:

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

    ViewModelLocationProvider.Register<ViewA, ViewABViewModel>();
    ViewModelLocationProvider.Register<ViewB, ViewABViewModel>();
}
protected override void ConfigureViewModelLocator()
{
base.ConfigureViewModelLocator();
ViewModelLocationProvider.Register();
ViewModelLocationProvider.Register();
}
它工作正常,但为我的2个视图创建了ViewModel的两个独立实例。 我希望我的两个视图使用同一个ViewModel实例。

检查显示默认情况下为每个视图创建新实例的问题:

static Func<Type, object> _defaultViewModelFactory = type => Activator.CreateInstance(type);
并通过返回这个已经准备好的实例来注册视图的工厂方法

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

Prism现在使用此实例,而不是创建新实例。

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

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

    Container.RegisterType<ViewAViewModel>(new ContainerControlledLifetimeManager()); //<--
    ViewModelLocationProvider.Register<ViewA, ViewABViewModel>();
    ViewModelLocationProvider.Register<ViewB, ViewABViewModel>();
}
protected override void ConfigureViewModelLocator()
{
base.ConfigureViewModelLocator();
RegisterType(新的ContainerControlledLifetimeManager())//
ViewModelLocationProvider.Register<ViewA>(() => vm);
ViewModelLocationProvider.Register<ViewB>(() => vm);
protected override void ConfigureViewModelLocator()
{
    base.ConfigureViewModelLocator();

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