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