Привязка ItemsControl
к коллекции объектов UserControl
работает нормально. Однако я хотел бы применить дополнительный XAML, например Border
и т. д.
Однако вместо Border
с UserControl отображается только сам UserControl. <ItemsControl.ItemTemplate>
, похоже, не имеет никакого эффекта.
Вопрос: Как создать ItemTemplate с дополнительным XAML? В настоящее время этот тег, похоже, «игнорируется».
Модель просмотра: ObservableCollection<UserControl> MyUserControls
<ItemsControl ItemsSource="{Binding MyUserControls, lementName=popupContainer}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<Grid />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<Border ...>
<ContentControl Content="{Binding}" />
</Border>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
Взгляд на справочный источник показывает, что метод IsItemItsOwnContainerOverride
класса ItemsControl имеет следующую реализацию:
protected virtual bool IsItemItsOwnContainerOverride(object item)
{
return (item is UIElement);
}
Таким образом, если вы передаете коллекцию UIElement в ItemsSource элемента управления ItemsControl, эти элементы используются непосредственно как контейнеры элементов без обычной обертки внутри ContentPresenter
. Следовательно, ItemTemplate
вообще не применяется.
Итак, ответ на вопрос
How can I design an ItemTemplate with additional XAML?
есть: Вовсе нет, если ItemsSource представляет собой набор UIElements.
Вместо этого следует следовать основной идее класса ItemsControl и назначить коллекцию объекты элемента данных свойству ItemsSource. Затем выберите соответствующие элементы управления пользовательского интерфейса с помощью DataTemplates, у которых свойство DataType
установлено для типов различных элементов данных.
Или вы создаете производный ItemsControl, который переопределяет метод IsItemItsOwnContainerOverride
:
public class MyItemsControl : ItemsControl
{
protected override bool IsItemItsOwnContainerOverride(object item)
{
return false;
}
}
Спасибо за ваш потрясающий ответ! Он охватывает оба варианта: 1.) Создание пользовательского класса
ItemsControl
; 2.) Рассматриваем возможность использования привязок надUserControls
. Однако я не понимаю, почему этот параметр запрещает это по умолчанию или почему для этого нет общедоступного DependencyProperty. Поскольку это так, я приму решение на основе данных фактов. Спасибо!