Как использовать AlternationIndex в ItemsControls?

Я видел некоторые статьи, которые показывают, как использовать AlternationIndex с ListBox es или ListView s, но я потратил несколько часов, пытаясь получить чередующиеся цвета фона на базе ItemsControl класс и ничего не работает.

27
задан Sheridan 22 May 2014 в 10:25
поделиться

1 ответ

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>
47
ответ дан 28 November 2019 в 04:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: