7

假设我有一组不同类的对象。每个类在资源文件中都有其 UserControl DataTemplated。

现在我想使用 ItemsControl 来显示集合,但我想要每个项目周围的 Border 或 Expander。

我希望这样的事情能够奏效:

<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?

4

2 回答 2

14

通常,您可能会考虑通过模板化项目容器来执行此操作。问题是“通用”ItemsControl使用ContentPresenter作为其项目容器。因此,即使您尝试设置样式,ItemContainerStyle您也会发现您无法提供模板,因为 ContentPresenter不支持控制模板(它确实支持数据模板但在这里没有用)。

ItemsControl要使用可模板化的容器,您必须像本中一样从中派生。

另一种方法可能只是使用ListBox控件。然后,您可以ListBoxItem通过样式设置模板来提供自定义模板。

您可以在此处阅读有关容器的更多信息。

(在您的允许下,我将解决方案添加到您的答案中,Guge)

    <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>
于 2010-10-23T13:02:11.530 回答
2

我只需执行以下操作:

<ItemsControl.ItemTemplate>
    <DataTemplate>
        <Border BorderBrush="Black" BorderThickness="3">
            <ContentControl Content={Binding} />
        </Border>
    </DataTemplate>
</ItemsControl.ItemTemplate>

由于标签内的数据上下文DataTemplate是源集合中的一个项目,我们可以使用 aContentControl来显示这个项目。{Binding}意味着我们绑定到整个数据上下文。您的项目的所有DataTemplates 将以与我们未指定 相同的方式隐式应用ItemsControl.ItemTemplate

于 2019-08-05T16:07:30.787 回答