Полиморфизм в отображении элементов
Если у контейнера (ListBox, TreeView и т.д.) ItemsSource принимает группу элементов, которые могут относиться к разным классом, как я могу создавать им различное представление? Например, у меня есть ObservableCollection<Animal>, при этом там могут содержаться экземпляры классов Cat, Dog и т.д. У кого-то может быть свойство с размахом крыльев, у кого-то с высотой прыжка, все это, естественно, не содержится в базовом классе Animal.
<ListBox ItemsSource="{Binding Items}">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding Name}" />
<!-- здесь содержимое должно быть типозависимым -->
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
Я не понимаю, как ItemTemplate может проверять на соответствие классу, выводя необходимые поля, которые могут различаться у разных классов. Если бы в XAML были условные блоки, то дело бы обстояло проще (как мне кажется).
Ответы (1 шт):
Вы можете использовать коллекцию DataTemplates для установки соответствия ViewModel и View, например у ListBox (можно и у UserControl):
<ListBox.DataTemplates>
<DataTemplate DataType="{x:Type vm:CatViewModel}">
<vw:CatView/>
</DataTemplate>
<DataTemplate DataType="{x:Type vm:DogViewModel}">
<vw:DogView/>
</DataTemplate>
</ListBox.DataTemplates>
Для самого ListBox ItemTemplate тогда не нужно устанавливать.