我能够在ItemsControl中使用ItemTemplate来以特定格式呈现项目。但是,如果ItemsControl中的某个项目恰好是一个TextBox,则将呈现该TextBox而不是ItemsTemplate的实例。据我所知,对于任何FrameworkElement都是如此。这是ItemsControl的预期行为,还是我做错了什么?
一个例子:
<ItemsControl>
<ItemsControl.ItemTemplate>
<DataTemplate>
<Grid Margin="5">
<Rectangle Fill="Blue" Height="20" Width="20" />
</Grid>
</DataTemplate>
</ItemsControl.ItemTemplate>
<ItemsControl.Items>
<sys:Object />
<TextBox />
<sys:Object />
<Rectangle Fill="Red" Height="20" Width="20" />
</ItemsControl.Items>
</ItemsControl>
我希望它显示四个蓝色矩形。我认为,每当定义了ItemTemplate时,集合中的每个项目都将呈现为模板的实例。但是,在这种情况下,将呈现以下内容:蓝色矩形,然后是TextBox,然后是蓝色矩形,再是红色矩形。
的ItemsControl
具有受保护构件IsItemItsOwnContainerOverride
被传递从项集合并返回一个对象true
,如果该对象可以被直接添加到项目面板而不产生的容器(和由此模板)。
对于从派生的任何对象,基本实现均返回true UIElement
。
要获得您期望的行为,您将需要继承ItemsControl
并重写此方法,并使该方法始终返回false。不幸的是,这还没有结束。如果该项为a ,则默认的实现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;
}
截至2015年,他们可能已修复了第二部分。使用.NET 4.5.1中的WPF,如果返回
false
,IsItemItsOwnContainerOverride,
则该模板似乎已设置在项目容器上。我不需要
PrepareContainerForItemOverride
.NET 4中的替代。