【发布时间】:2010-10-01 21:37:09
【问题描述】:
我可以在 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,然后是一个蓝色矩形,然后是一个红色矩形。
【问题讨论】:
-
我猜这是有意的行为,旨在让开发人员能够添加特殊的一次性使用控件。例如,我可能会使用它向 ComboBox 添加一个按钮以清除选择,或者我可能将一个 TextBox 放入一个过滤由 ItemsSource 指定的集合的 ListBox 中。我很想听到有人对这种行为有一些官方答案,因为我发现使用 ItemTemplate 违反直觉。
-
Anthony 提出的好问题和好答案,谢谢大家。
-
它无疑是 UI 和数据模型的混搭。嗯。但是,一个人假设,作为一种优化,它希望减轻
ItemsControl繁忙的工作,因此它必须包装它遇到的每个 POCO 实例。特别是因为ItemsPanel中的ScrollViewer可以迅速牵连成百上千个这些所谓的“容器”。这可能是一个纯粹的选择加入功能(即如果对IsItemItsOwnContainerOverride的基本调用总是返回false)而不是 WPF 强行插入以断言您报告的意外行为可能会更好。
标签: wpf silverlight itemscontrol itemtemplate