[英]WPF ItemsControl bound to UserControls
绑定到UserControl
对象集合的ItemsControl
正常工作。 但是,我想应用其他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>
查看参考源可以发现ItemsControl类的IsItemItsOwnContainerOverride
方法具有以下实现:
protected virtual bool IsItemItsOwnContainerOverride(object item)
{
return (item is UIElement);
}
因此,如果将UIElements的集合传递给ItemsControl的ItemsSource,则这些元素将直接用作项目容器,而无需在ContentPresenter
进行通常的包装。 因此根本没有应用ItemTemplate
。
所以问题的答案
如何设计带有附加XAML的ItemTemplate?
是:如果ItemsSource是UIElements的集合,则完全没有。
相反,您应该遵循ItemsControl类的基本思想,并将数据项对象的集合分配给ItemsSource属性。 然后通过DataTemplates选择合适的UI控件,这些控件的DataType
属性设置为不同数据项的类型。
或者,您创建派生的ItemsControl,它重写IsItemItsOwnContainerOverride
方法:
public class MyItemsControl : ItemsControl
{
protected override bool IsItemItsOwnContainerOverride(object item)
{
return false;
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.