Wpf 如何将containerRegistry.RegisterForNavigation与通用ViewModel一起使用?

Wpf 如何将containerRegistry.RegisterForNavigation与通用ViewModel一起使用?,wpf,mvvm,navigation,prism,Wpf,Mvvm,Navigation,Prism,我有一个带有两个区域的应用程序,一个作为数据类型的选择器(称为NavigationPane),另一个作为该数据类型的setter视图(称为SimulationPane)。我用来填充SimulationPane的SimulatorView.xaml有一个相应的SimulatorViewModel,它动态创建TDataType的可设置属性列表,并最终将其绑定到SimulatorView.xaml中的ItemsControl。因此,我的ViewModel需要System.Type作为输入: 我想按如下

我有一个带有两个区域的应用程序,一个作为数据类型的选择器(称为NavigationPane),另一个作为该数据类型的setter视图(称为SimulationPane)。我用来填充SimulationPane的SimulatorView.xaml有一个相应的SimulatorViewModel,它动态创建TDataType的可设置属性列表,并最终将其绑定到SimulatorView.xaml中的ItemsControl。因此,我的ViewModel需要System.Type作为输入:

我想按如下方式设置它:

    public void RegisterTypes(IContainerRegistry containerRegistry)
    {
        containerRegistry.RegisterForNavigation<TopicSelectorView, TopicSelectorViewModel>("Selector");
        containerRegistry.RegisterForNavigation<SimulatorView, SimulatorViewModel<A>>("Simulator_A");
        containerRegistry.RegisterForNavigation<SimulatorView, SimulatorViewModel<B>>("Simulator_B"); // and so on..
    }
其中topicType是基于用户选择的数据类型(此处为“A”、“B”等)

这种方法的问题是,我最终只得到一个ViewModel,即我上次注册的那个。我的印象是,注册使用了某种类型的字典,并将view作为键


我做错了什么?否则,我如何才能实现在运行时为VM提供类型并导航到它的目标?

为什么需要将
a
B
作为通用参数传递

我将有一个
模拟器viewmodel
,并注入一个服务,视图模型可以从中获得用户设置的参数列表。这可以通过反射(在模拟器类型上)或参数描述符列表(
IReadOnlyCollection ISimulator.Parameters{get;}
)来完成,您可以选择任何方式

更改模拟器类型时,您会在服务中更新它,
SimulatorViewModel
会更新其参数列表,因为它会侦听服务的
INotifyPropertyChanged.PropertyChanged

否则,我如何才能实现在运行时为VM提供类型并导航到它的目标

Prism中不支持使用同一视图注册多个viewmodels。见@brianlagunas关于以下问题的回答:

正如我在回复您的公关时所说,这不是我们在Prism中支持的东西。你们有几个选择,其中两个我们已经讨论过了;创建一个唯一的视图,或者创建一个VM并加载相关数据

regionManager.RequestNavigate("SimulationPane", $"Simulator_{topicType.Name}");