Подтвердить что ты не робот

Два элемента для одного списка

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

<ListBox ItemsSource="{Binding Fruits}">

И у меня есть

class BananaViewModel : FruitViewModel

и

class AppleViewModel : FruitViewModel

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

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

4b9b3361

Ответ 1

Вы можете определить DataTemplates, которые применяются к любому экземпляру определенного типа, указав 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>

Ответ 2

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

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

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