将ItemsControl
绑定到UserControl
对象的集合可以正常工作。但是,我想应用其他XAML,例如Border
等。
但是,不是呈现UserControl的Border
,而是呈现UserControl本身。 <ItemsControl.ItemTemplate>
似乎没有任何作用。
问题:如何设计带有其他XAML的ItemTemplate?目前,此标签似乎已被“忽略”。
ViewModel: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>
答案 0 :(得分:1)
看看reference source,发现ItemsControl类的IsItemItsOwnContainerOverride
方法具有以下实现:
protected virtual bool IsItemItsOwnContainerOverride(object item)
{
return (item is UIElement);
}
因此,如果将UIElements的集合传递给ItemsControl的ItemsSource,则这些元素将直接用作项目容器,而无需通常包装在ContentPresenter
内。因此,根本不会应用ItemTemplate
。
所以问题的答案
如何设计带有附加XAML的ItemTemplate?
是:如果ItemsSource是UIElements的集合,则完全没有。
您应该改为遵循ItemsControl类的基本思想,并将数据项对象的集合分配给ItemsSource属性。然后,根据数据模板选择DataType
属性设置为不同数据项类型的适当UI控件。
或者您创建一个派生的ItemsControl来覆盖IsItemItsOwnContainerOverride
方法:
public class MyItemsControl : ItemsControl
{
protected override bool IsItemItsOwnContainerOverride(object item)
{
return false;
}
}