假设我有一组不同类的对象。每个类在资源文件中都有UserControl DataTemplated。
现在我想使用ItemsControl来显示集合,但我想在每个项目周围使用边框或扩展器。
我希望这样的事情可以发挥作用:
<ItemsControl ItemsSource="{Binding MyObjects}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Orientation="Horizontal"/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<Border BorderBrush="Black" BorderThickness="3">
<ContentPresenter/>
</Border>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
但是ContentPresenter似乎选择了ItemTemplate,因为我得到了堆栈溢出。
如何在ItemTemplate中获取每个Item的DataTemplate?
答案 0 :(得分:11)
通常,您可以考虑通过模板化项容器来完成此操作。问题是“通用”ItemsControl
使用ContentPresenter
作为其项容器。因此,即使您尝试使用ItemContainerStyle
设置样式,您也会发现无法提供模板,因为ContentPresenter
不支持控件模板(它确实支持数据模板但在此处没有用)。
要使用可模压的容器,您必须像example中的ItemsControl
一样来自ListBox
。
替代方案可能只是使用ListBoxItem
控件。然后,您可以通过样式设置 <ListBox ItemsSource="{Binding MyObjects}" Grid.Column="1">
<ListBox.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Orientation="Horizontal"/>
</ItemsPanelTemplate>
</ListBox.ItemsPanel>
<ListBox.ItemContainerStyle>
<Style TargetType="{x:Type ListBoxItem}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type ListBoxItem}">
<Border BorderBrush="Black" BorderThickness="3">
<ContentPresenter/>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ListBox.ItemContainerStyle>
</ListBox>
模板来提供自定义模板。
您可以阅读有关容器here的更多信息。
(使用你的permissen我正在为你的答案添加解决方案,Guge)
{{1}}
答案 1 :(得分:1)
我将执行以下操作:
<ItemsControl.ItemTemplate>
<DataTemplate>
<Border BorderBrush="Black" BorderThickness="3">
<ContentControl Content={Binding} />
</Border>
</DataTemplate>
</ItemsControl.ItemTemplate>
由于DataTemplate
标记内的数据上下文是源集合中的一项,因此我们可以使用ContentControl
来显示此项。 {Binding}
意味着我们要绑定到整个数据上下文。您项目的所有DataTemplate
都将隐式应用,就像我们没有指定ItemsControl.ItemTemplate
一样。