如何使用containerRegistry.具有通用ViewModel的RegisterForNavigation



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

我想设置如下:

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..
}

一旦我注册了它,我想能够调用(从其他模块(:

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

其中topicType是基于用户选择的数据类型(此处:"A"、"B"等(。

这种方法的问题是,我最终只得到一个ViewModel,即我最后注册的那个。我的印象是,注册使用了某种以视图为关键字的词典。

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

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

Prism不支持使用同一视图注册多个视图模型。查看@brianlagunas在GitHub:上的回答

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

为什么需要将AB作为泛型参数传递?

我会有一个SimulatorViewModel,并注入一个服务,视图模型可以从中获得要由用户设置的参数列表。这可以通过反射(在模拟器类型上(或参数描述符列表(IReadOnlyCollection<Parameter> ISimulator.Parameters { get; }(来完成,无论您喜欢什么。

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

相关内容

  • 没有找到相关文章

最新更新