Пользовательский элемент управления WPF - шаблон ItemsControl не применяется - PullRequest
7 голосов
/ 01 мая 2010

Я создаю пользовательский элемент управления WPF, производный от TabControl. В ControlTemplate я использую ItemsControl для отображения списка, который привязан к шаблону (наблюдаемая коллекция типа FileMenuItem). Во время выполнения программы я получаю следующую ошибку в окне вывода:

ItemTemplate и ItemTemplateSelector игнорируются для элементов уже Тип контейнера ItemsControl; Тип = 'FileMenuItem'

Тип FileMenuItem является производным от MenuItem. Если я изменю базовый класс на DependencyObject, код на самом деле выполняется и шаблон применяется (так что это вариант). Я погуглил ошибку и не смог найти в ней ничего, кто-нибудь сталкивался с этим при разработке пользовательских элементов управления? Несмотря на то, что у меня есть обходной путь, я хотел бы понять, что происходит, и я думаю, что использование MenuItem в качестве базового класса является более чистой реализацией.

Я могу опубликовать больше кода, если это поможет. Спасибо!

1 Ответ

7 голосов
/ 03 мая 2010

Цель 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...