Я видел некоторые статьи, которые показывают, как использовать AlternationIndex
с ListBox
es или ListView
s, но я потратил несколько часов, пытаясь получить чередующиеся цвета фона на базе ItemsControl
класс и ничего не работает.
ItemContainerStyle применяется к элементам, созданным ItemsControl: ContentPresenter. ContentPresenter, в свою очередь, будет содержать все, что вы поместили в свой ItemTemplate. В случае ListBox, ItemContainerStyle применяется к сгенерированному ListBoxItem.
На основе того, что вы опубликовали, AlternationCount доступен только для этих сгенерированных элементов. Вы не можете использовать ItemContainerStyle для установки фона сетки, потому что сетка неизвестна этому стилю.
Следующее было бы идеально, но, к сожалению, ContentPresenter не имеет свойства background. Однако это будет работать для ListBox (с ListBoxItems).
<ItemsControl
ItemsSource="{Binding ObservableCollectionItems}"
AlternationCount="2">
<ItemsControl.ItemContainerStyle>
<Style TargetType="ContentPresenter">
<Style.Triggers>
<Trigger Property="ItemsControl.AlternationIndex" Value="0">
<Setter Property="Background" Value="Red"></Setter>
</Trigger>
<Trigger Property="ItemsControl.AlternationIndex" Value="1">
<Setter Property="Background" Value="Blue"></Setter>
</Trigger>
</Style.Triggers>
</Style>
</ItemsControl.ItemContainerStyle>
</ItemsControl>
В итоге вы пишете стиль для сетки, который привязывается к AlternationIndex вашего родительского ContentPresenter.
<DataTemplate DataType="{x:Type vm:ObservableCollectionItem}">
<Grid>
<Grid.Style>
<Style TargetType="Grid">
<Style.Triggers>
<DataTrigger Binding="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ContentPresenter}}, Path=(ItemsControl.AlternationIndex)}" Value="0">
<Setter Property="Background" Value="Red"/>
</DataTrigger>
<DataTrigger Binding="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ContentPresenter}}, Path=(ItemsControl.AlternationIndex)}" Value="1">
<Setter Property="Background" Value="Blue"/>
</DataTrigger>
</Style.Triggers>
</Style>
</Grid.Style>
</Grid>
</DataTemplate>