使用这篇文章DataTemplateManager
中的您可以执行以下操作:
DataTemplateManager.RegisterDataTemplate<ViewModelType1, ViewType1>();
DataTemplateManager.RegisterDataTemplate<ViewModelType2, ViewType2>();
DataTemplateManager.RegisterDataTemplate<ViewModelType3, ViewType3>();
然后你会ItemTemplate
从 ListBox 中删除:
<ListBox ItemSource="{Binding Targets}"/>
在 ListBox ViewModel 中,您可以:
public void AddTargets()
{
Targets.Add(new ViewModelType1());
Targets.Add(new ViewModelType2());
Targets.Add(new ViewModelType3());
}
然后,DataTemplate
WPF 会自动使用 each 来渲染每个对应的 ViewModel。
另请注意,您可以DataTemplateManager.RegisterDataTemplate()
在显示 ListBox 之前随时调用,因此理论上您可以在加载 MEF 部件时这样做。
编辑:
根据您的评论,您可以创建一个带有 ContentPresenter 的 DataTemplate 以根据 ViewModel 中的属性显示所选视图:
<DataTemplate DataType="{x:Type local:TargetViewModel}">
<ContentPresenter x:Name="MainContentPresenter" Content="{Binding}" ContentTemplate="{Binding YourProperty, Converter=SomeConverter}"/>
在 SomeConverter 中,您应该使用与帖子中演示的相同的技术来动态生成 DataTemplate。