две шаблоны элементов для одного списка - PullRequest
37 голосов
/ 23 октября 2010

У меня есть класс FruitViewModel.Он описывает ViewModels для ListBox элементов.

<ListBox ItemsSource="{Binding Fruits}">

И у меня есть

class BananaViewModel : FruitViewModel

и

class AppleViewModel : FruitViewModel

Fruits содержит BananaViewModel си AppleViewModel s, который связан с ItemsSource.

Как я могу сделать различные шаблоны для яблок и бананов?Они должны быть в одном списке, но иметь разные шаблоны

Ответы [ 2 ]

69 голосов
/ 23 октября 2010

Вы можете определить шаблоны данных, которые применяются к любому экземпляру определенного типа, указав DataType без x:Key. Используя этот метод, вы ничего не назначаете ItemTemplate - шаблоны применяются автоматически.

<ListBox ItemsSource="{Binding Path=MixedList}">
    <ListBox.Resources>
        <DataTemplate DataType="{x:Type local:BananaViewModel}">
            <TextBlock Text="{Binding Name}" Foreground="Yellow"/>
        </DataTemplate>
        <DataTemplate DataType="{x:Type local:AppleViewModel}">
            <TextBlock Text="{Binding Name}" Foreground="Red"/>
        </DataTemplate>
    </ListBox.Resources>
</ListBox>
3 голосов
/ 23 октября 2010

В ListView в XAML вы можете объявить ItemTemplateSelector.Значение для этого будет получено из статического ресурса или аналогичного.

Реализация вашего селектора шаблона должна реализовывать DataTemplateSelector и в основном будет содержать оператор 'if', который выбирает правильный DataTemplate на основе типа связанного элемента,Вероятно, он найдет DataTemplate из переданных в контейнере ресурсов (возможно, с использованием функции FindResource).

Редактировать: Возможно, хорошая ссылка?http://www.switchonthecode.com/tutorials/wpf-tutorial-how-to-use-a-datatemplateselector Мертвая ссылка.

...