ListView中动态嵌套的DataTemplate

时间:2009-04-07 09:24:11

标签: wpf listview datatemplate

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

我可以在没有TemplateSelector的情况下实现这一目标吗? WPF能够根据绑定的类型自动选择正确的DataTemplate。但是,这在ListView中的嵌套场景中是否也能以某种方式工作?

2 个答案:

答案 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设置。