Wpf 在ListView中动态嵌套数据模板

Wpf 在ListView中动态嵌套数据模板,wpf,listview,datatemplate,Wpf,Listview,Datatemplate,我有一个MyTypeOneViewModel类型的对象显示在ListView的第一列中,我有一个MyTypeTwoViewModel类型的对象显示在ListView的第二列中。这两种类型都具有MyNestedViewModel类型的属性。现在,我想为ListView中的每个单元格显示不同的DataTemplate,具体取决于该属性的实际类型。例如,如果该属性实际包含MyDoubleNestedViewModel,则我希望在该单元格中显示文本框;如果该属性包含MyBooleanNestedView

我有一个MyTypeOneViewModel类型的对象显示在ListView的第一列中,我有一个MyTypeTwoViewModel类型的对象显示在ListView的第二列中。这两种类型都具有MyNestedViewModel类型的属性。现在,我想为ListView中的每个单元格显示不同的DataTemplate,具体取决于该属性的实际类型。例如,如果该属性实际包含MyDoubleNestedViewModel,则我希望在该单元格中显示文本框;如果该属性包含MyBooleanNestedViewModel,则我希望在ListView的特定单元格中显示组合框。请注意,DataTemplate在每一行和每一列中都可能有所不同


没有TemplateSelector我可以实现这一点吗?WPF能够根据绑定类型自动选择正确的数据模板。但是,在ListView中的嵌套场景中,这是否也会起作用呢?

请考虑以下选项:

1。直接绑定到子属性。

将列绑定到子属性(类型为
MyNestedViewModel
)而不是父属性。然后,WPF将根据嵌套视图模型的类型而不是父视图模型的类型选择模板

<GridViewColumn DisplayMemberBinding="{Binding TheChildViewModel}"/>

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>
xmlns:ui=“clr命名空间:您的程序集”
现在,此模板将与此窗口中的任何列表或内容控件一起使用 绑定到视图模型对象。您不需要指定ItemTemplate设置

 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>