wpf 无法同时使用ItemTemplate和ItemContainerStyle?

ldioqlga  于 2022-12-19  发布在  其他
关注(0)|答案(2)|浏览(243)

我正在尝试将ItemTemplate和ItemContainerStyle都应用到ItemsControl:-

<ItemsControl ItemsSource="{Binding LogEntries}"
              ItemTemplate="{StaticResource itemTemplate}"
              ItemContainerStyle="{StaticResource itemContainer}" />

然而,ItemContainerStyle似乎被忽略了(但如果我删除ItemTemplate,它确实可以工作)。
条目模板相当复杂,在许多不同的视图中使用。在一个特定的视图中,我需要更改列表条目的间距和背景颜色,因此我也尝试应用ItemContainerStyle,它看起来像这样:-

<Style x:Key="itemContainer"
       TargetType="ContentPresenter">
    <Setter Property="ContentTemplate">
        <Setter.Value>
            <DataTemplate>
                <Border x:Name="itemBorder"
                        Margin="4,0,4,4"
                        Background="#666666">
                    <ContentPresenter Content="{Binding}" />
                </Border>
            </DataTemplate>
        </Setter.Value>
    </Setter>
</Style>

我有点惊讶,你不能同时应用这两个,除非我错过了什么?我假设ItemContainerStyle实际上只是一个围绕项目内容的“ Package 器”,而不管项目的内容是否是模板化的。

nnsrf1az

nnsrf1az1#

ItemContainerStyle * 不是 * 任何东西的“ Package 器”...它是Style。您 * 可以 * 设置项容器的Style * 和 * ItemTemplate属性,但问题的原因是您试图设置StyleContentPresenterContentTemplate属性,而该属性被ItemTemplate.(见评论部分的@Clemens链接)。
解决此问题的一种方法是使用将其数据项 Package 在ListBoxItem中的ListBox,并为Template属性而不是ContentTemplate提供值。(当然,您可以添加一个Style来删除其边框,使其看起来像ItemsControl)。ItemContainerStyle将影响ListBoxItem。但是,您必须了解其中的区别。
ItemContainerStyle会影响ListBoxItem,而ItemTemplate是用来定义里面的数据对象的,所以在ItemContainerStyle中定义一个Border,定义数据在ItemTemplate中的样子比较合适,试试这个:

<ListBox ItemsSource="{Binding Items}">
    <ListBox.ItemContainerStyle>
        <Style TargetType="{x:Type ListBoxItem}">
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate>
                        <Border Margin="4,0,4,4" Background="#666666">
                            <ContentPresenter Content="{Binding}" />
                        </Border>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </ListBox.ItemContainerStyle>
    <ListBox.ItemTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding}" />
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>
icomxhvb

icomxhvb2#

我在使用stackoverflow的代码片段时遇到了同样的问题。如果你让visual studio生成默认的ItemContainerStyle,这个问题就可以解决。它是一个相当长的模板,所以我只删除了我不需要的部分。
在visual studio中单击设计器中的ListView,在属性窗口中向下滚动到杂项部分,然后单击ItemContainerStyle旁边的向下箭头,然后单击Convert to a new resource。
警告列表中有两个非常相似的项目(ItemContainerStyle和ItemContainerStyleSelector),请选择正确的项目。如果属性窗口不够宽,很容易漏掉。

相关问题