динамически вкладывать DataTemplates в ListView

У меня есть объект типа MyTypeOneViewModel, который отображается в первом столбце ListView, и у меня есть объект типа MyTypeTwoViewModel, который отображается во втором столбце моего ListView. Оба типа имеют свойство типа MyNestedViewModel. Теперь я хотел бы отображать разные DataTemplate для каждой ячейки в ListView в зависимости от фактического типа этого свойства. Например, если свойство на самом деле содержит MyDoubleNestedViewModel, я хочу отобразить Textbox в этой ячейке, и если это свойство содержит MyBooleanNestedViewModel, я хочу отобразить ComboBox в этой конкретной ячейке ListView. Обратите внимание, что DataTemplate может различаться в каждой строке и столбце.

Могу ли я добиться этого без TemplateSelector? WPF может автоматически выбирать правильный DataTemplate на основе связанного типа. Но работает ли это и в этом вложенном сценарии в ListView?


person bitbonk    schedule 07.04.2009    source источник


Ответы (2)


Рассмотрим эти варианты:

<сильный>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>
person Kent Boogaart    schedule 07.04.2009

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.

person Kelly    schedule 07.04.2009