динамически вкладывать шаблоны данных в ListView - PullRequest
0 голосов
/ 07 апреля 2009

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

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

Ответы [ 2 ]

1 голос
/ 07 апреля 2009

Рассмотрим следующие варианты:

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>
0 голосов
/ 07 апреля 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.

...