Пользовательский элемент управления WPF - шаблон ItemsControl не применяется
Я создаю пользовательский элемент управления WPF, производный от TabControl. В ControlTemplate я использую ItemsControl для отображения списка, который привязан к шаблону (наблюдаемая коллекция типа FileMenuItem). Во время выполнения программы я получаю следующую ошибку в окне вывода:
ItemTemplate и ItemTemplateSelector игнорируются для элементов, уже имеющих тип контейнера ItemsControl; Тип = 'FileMenuItem'
Тип FileMenuItem является производным от MenuItem. Если я изменю базовый класс на DependencyObject, код на самом деле выполняется и шаблон применяется (так что это вариант). Я погуглил ошибку и не смог найти в ней ничего, кто-нибудь сталкивался с этим при разработке пользовательских элементов управления? Несмотря на то, что у меня есть обходной путь, я хотел бы понять, что происходит, и я думаю, что использование MenuItem в качестве базового класса является более чистой реализацией.
Я могу опубликовать больше кода, если это поможет. Спасибо!
1 ответ
Цель DataTemplate (например, ItemTemplate) - предоставить визуализацию для объекта данных. В частности, он определяет набор элементов для добавления в визуальное дерево вместо данных, передаваемых ContentPresenter или ItemsPresenter. В вашем случае ваш список источников представляет собой набор объектов, которые уже могут быть добавлены непосредственно в визуальное дерево для отображения в пользовательском интерфейсе.
Вы можете увидеть это в следующем упрощенном примере, где только "Три" отображается красным, потому что первые два элемента определены в форме, которая может отображаться непосредственно ComboBox.
<ComboBox>
<ComboBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding}" Foreground="Red"/>
</DataTemplate>
</ComboBox.ItemTemplate>
<ComboBoxItem>One</ComboBoxItem>
<ComboBoxItem>Two</ComboBoxItem>
<sys:String>Three</sys:String>
</ComboBox>