我能够在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,它从items集合传递一个对象,如果该对象可以直接添加到items面板而没有生成的容器(从而被模板化),则返回true.
对于从UIElement派生的任何对象,基本实现返回true.
要获得您期望的行为,您需要从ItemsControl继承并重写此方法并使其始终返回false.不幸的是,这不是问题的终点.如果项目是UIElement,则PrepareContainerForItemOverride的默认实现仍然不会将ItemTemplate分配给容器,因此您还需要覆盖此方法: –
protected override bool IsItemItsOwnContainerOverride(object item) { return false; } protected override void PrepareContainerForItemOverride(DependencyObject element,object item) { base.PrepareContainerForItemOverride(element,item); ((ContentPresenter)element).ContentTemplate = ItemTemplate; }
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。