wpf – 如何在ItemsControls中使用AlternationIndex?

我看过一些文章,显示如何使用AlternateIndex与ListBoxes或ListViews,但我花了几个小时尝试在基础ItemsControl类获得交替的背景颜色,似乎没有任何工作。所有列表框示例我看到使用ListBoxItem作为基于alternationIndex设置背景的样式的目标类型 – 就像这样从MSDN

<Grid>
    <Grid.Resources>
        <Style x:Key="alternatingWithTriggers" TargetType="{x:Type ListBoxItem}">
            <Setter Property="Background" Value="Blue"/>
            <Setter Property="Foreground" Value="White"/>
            <Style.Triggers>
                <Trigger Property="ListBox.AlternationIndex" Value="1">
                    <Setter Property="Background" Value="CornflowerBlue"/>
                    <Setter Property="Foreground" Value="Black"/>
                </Trigger>
                <Trigger Property="ListBox.AlternationIndex" Value="2">
                    <Setter Property="Background" Value="LightBlue"/>
                    <Setter Property="Foreground" Value="Navy"/>
                </Trigger>
            </Style.Triggers>
        </Style>

    </Grid.Resources>
    <ListBox AlternationCount="3" ItemsSource="{StaticResource data}" 
             ItemContainerStyle="{StaticResource alternatingWithTriggers}">
    </ListBox>
</Grid>

我想使用ItemsControl,因为我不想选择功能,我认为修改ListBox来隐藏它可能不是最好的选择。

这是我正在尝试的事情之一:

<DataTemplate DataType="{x:Type vm:ObservableCollectionItem}">
    <Grid>
        <!-- some content here -->
    </Grid>
</DataTemplate>

<!-- ... -->

<ItemsControl
    ItemsSource="{Binding ObservableCollectionItems}"
    AlternationCount="2"
>
    <ItemsControl.ItemContainerStyle>
        <Style>
            <Style.Triggers>
                <Trigger Property="ItemsControl.AlternationIndex" Value="0">
                    <Setter Property="Grid.Background" Value="Red"></Setter>
                </Trigger>
                <Trigger Property="ItemsControl.AlternationIndex" Value="1">
                    <Setter Property="Grid.Background" Value="Blue"></Setter>
                </Trigger>
            </Style.Triggers>
        </Style>
    </ItemsControl.ItemContainerStyle>
</ItemsControl>

我看到的问题是,视觉树有一个ContentPresenters的列表,其中ItemsControl.AlternationIndex在0和1之间交替,但每个ContentPresenter中的Grid将ItemsControl.AlternationIndex设置为0。

大概有一些我很失望的东西

ItemContainerStyle应用于ItemsControl:ContentPresenter生成的元素。 ContentPresenter将反过来包含您在ItemTemplate中放置的任何内容。在ListBox的情况下,ItemContainerStyle应用于生成的ListBoxItem。

根据您发布的内容,AlternatingCount仅适用于这些生成的项目。您不能使用ItemContainerStyle设置网格的背景,因为该格式的格式是未知的。

以下是理想的,但不幸的是,ContentPresenter没有背景属性。然而,它将适用于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>

所以你最终编写一个格式,绑定到你的父ContentPresenter的AlternationIndex。

<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>
http://stackoverflow.com/questions/3567778/how-to-use-alternationindex-in-itemscontrols

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:wpf – 如何在ItemsControls中使用AlternationIndex?