在ItemsControl中的每个项目周围包裹一些东西

时间:2010-10-23 11:19:07

标签: wpf datatemplate itemscontrol itemtemplate

假设我有一组不同类的对象。每个类在资源文件中都有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?

2 个答案:

答案 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一样。