我有一个MyTypeOneViewModel类型的对象,它显示在ListView的第一列中,我有一个MyTypeTwoViewModel类型的对象,它显示在ListView的第二列中。两种类型都具有MyNestedViewModel类型的属性。现在我想为ListView中的每个单元格显示不同的DataTemplate,具体取决于该属性的实际类型。例如,如果属性实际上包含MyDoubleNestedViewModel,我想在该单元格中显示一个Textbox,如果该属性包含MyBooleanNestedViewModel,我想在ListView的特定单元格中显示一个ComboBox。请注意,DataTemplate可能在每行和每列中有所不同。
我可以在没有TemplateSelector的情况下实现这一目标吗? WPF能够根据绑定的类型自动选择正确的DataTemplate。但是,这在ListView中的嵌套场景中是否也能以某种方式工作?
答案 0 :(得分:1)
考虑以下选项:
<强> 1。直接绑定到子属性。
将列绑定到子属性(类型MyNestedViewModel
)而不是父类。然后,WPF将根据嵌套视图模型的类型选择模板,而不是父视图模型的类型。
<GridViewColumn DisplayMemberBinding="{Binding TheChildViewModel}"/>
<强> 2。在您的单元格模板中加入ContentControl
。
在网格列模板中,将ContentControl
绑定到子属性:
<GridViewColumn.CellTemplate>
<DataTemplate>
<StackPanel>
<Label Content="{Binding SomePropertyOnParentViewModel}"/>
<ContentControl Content="{Binding TheChildViewModel}"/>
</StackPanel>
</DataTemplate>
</GridViewColumn.CellTemplate>
答案 1 :(得分:0)
WPF可以完全按照您的意愿行事。
引用具有数据类型的程序集,并为需要显示的每种类型添加DataTemplate资源。
xmlns:ui="clr-namespace:YourAssembly"
<Window.Resources>
<DataTemplate DataType="ui:MyDoubleNestedViewModel ">
<Grid Margin="5,5,5,5" >
<TextBlock Text="{Binding Path=Value}"/>
</Grid>
</DataTemplate>
<DataTemplate DataType="ui:MyBooleanNestedViewModel ">
<Grid Margin="5,5,5,5" >
<ComboBox ItemsSource="{Binding Path=Items}"/>
</Grid>
</DataTemplate>
</Window.Resources>
现在,此模板将与此窗口中的任何列表或内容控件一起使用 绑定到视图模型对象。您无需指定ItemTemplate设置。