ItemsControl
имеет защищенный элемент IsItemItsOwnContainerOverride
, который передает объект из коллекции элементов и возвращает true
, если этот объект может быть добавлен непосредственно на панель элементов без созданного контейнера (и, следовательно, с помощью шаблона).
Базовая реализация возвращает true для любого объекта, производного от UIElement
.
Чтобы получить поведение, которое вы ожидаете, вам нужно унаследовать от ItemsControl
и переопределить этот метод, чтобы он всегда возвращал false. К сожалению, это еще не конец. Реализация по умолчанию PrepareContainerForItemOverride
по-прежнему не назначает ItemTemplate
контейнеру, если элемент является UIElement
, поэтому вам также необходимо переопределить этот метод: -
protected override bool IsItemItsOwnContainerOverride(object item)
{
return false;
}
protected override void PrepareContainerForItemOverride(DependencyObject element, object item)
{
base.PrepareContainerForItemOverride(element, item);
((ContentPresenter)element).ContentTemplate = ItemTemplate;
}