我正在尝试将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 器”,而不管项目的内容是否是模板化的。
2条答案
按热度按时间nnsrf1az1#
ItemContainerStyle
* 不是 * 任何东西的“ Package 器”...它是Style
。您 * 可以 * 设置项容器的Style
* 和 *ItemTemplate
属性,但问题的原因是您试图设置Style
中ContentPresenter
的ContentTemplate
属性,而该属性被ItemTemplate
.(见评论部分的@Clemens链接)。解决此问题的一种方法是使用将其数据项 Package 在
ListBoxItem
中的ListBox
,并为Template
属性而不是ContentTemplate
提供值。(当然,您可以添加一个Style
来删除其边框,使其看起来像ItemsControl
)。ItemContainerStyle
将影响ListBoxItem
。但是,您必须了解其中的区别。ItemContainerStyle
会影响ListBoxItem
,而ItemTemplate
是用来定义里面的数据对象的,所以在ItemContainerStyle
中定义一个Border
,定义数据在ItemTemplate
中的样子比较合适,试试这个:icomxhvb2#
我在使用stackoverflow的代码片段时遇到了同样的问题。如果你让visual studio生成默认的ItemContainerStyle,这个问题就可以解决。它是一个相当长的模板,所以我只删除了我不需要的部分。
在visual studio中单击设计器中的ListView,在属性窗口中向下滚动到杂项部分,然后单击ItemContainerStyle旁边的向下箭头,然后单击Convert to a new resource。
警告列表中有两个非常相似的项目(ItemContainerStyle和ItemContainerStyleSelector),请选择正确的项目。如果属性窗口不够宽,很容易漏掉。