Полиморфизм в отображении элементов

Если у контейнера (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 шт):

Автор решения: Cost

Вы можете использовать коллекцию 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 тогда не нужно устанавливать.

→ Ссылка