Два элемента для одного списка
У меня есть класс FruitViewModel
. Он описывает ViewModels для элементов ListBox
.
<ListBox ItemsSource="{Binding Fruits}">
И у меня есть
class BananaViewModel : FruitViewModel
и
class AppleViewModel : FruitViewModel
Fruits
содержит BananaViewModel
и AppleViewModel
, который привязан к ItemsSource
.
Как я могу сделать разные шаблоны для яблок и бананов? Они должны быть в одном списке, но иметь разные шаблоны
Ответы
Ответ 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