具有两个DataTemplates的ItemsControl使用AlternationIndex触发器,XAML

时间:2015-02-09 16:30:37

标签: wpf xaml

我有一个带有项目控件的用户控件,我希望它有两个完全不同的项目模板样式,具体取决于交替索引。我已经看过很多关于如何根据索引更改背景颜色但不改变每个索引的样式的教程。这是我到目前为止所拥有的。

定义模板:

<UserControl.Resources>
    <DataTemplate x:Key="ItemLeft" >
        <Border Background="Blue" Height="10">
            <!-- Define Left Style -->

        </Border>
    </DataTemplate>
    <DataTemplate x:Key="ItemRight">
        <Border Background="Red" Height="10">
            <!-- Define Right Style -->

        </Border>
    </DataTemplate>
</UserControl.Resources>

我删除了数据模板代码,以便于阅读。它比边框颜色更多。

物品管制:

        <ItemsControl Name="ItemControl" AlternationCount="2">
            <ItemsControl.ItemsPanel>
                <ItemsPanelTemplate>
                    <VirtualizingStackPanel IsItemsHost="True"/>
                </ItemsPanelTemplate>
            </ItemsControl.ItemsPanel>
            <ItemsControl.Style>
                <Style>
                    <Style.Triggers>
                        <Trigger Property="ItemsControl.AlternationIndex" Value="0">
                            <Setter Property="ItemsControl.ItemTemplate" Value="{StaticResource ItemRight}"/>
                        </Trigger>
                        <Trigger Property="ItemsControl.AlternationIndex" Value="1">
                            <Setter Property="ItemsControl.ItemTemplate" Value="{StaticResource ItemLeft}"/>
                        </Trigger>
                    </Style.Triggers>
                </Style>
            </ItemsControl.Style>
        </ItemsControl>

我很确定我不应该在风格中做这种类型的触发器,但我不确定如何做到这一点。我是使用WPF的新手,我发现其中大部分都非常直观,但我迷失在这里。我想尝试将其包含在XAML代码中。

由于

2 个答案:

答案 0 :(得分:3)

ItemTemplate适用于所有商品。您可以使用ContentControl作为ItemTemplate的自定义样式,根据ContentTemplate选择ItemsControl.AlternationIndex

<ItemsControl Name="ItemControl" AlternationCount="2">
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <VirtualizingStackPanel IsItemsHost="True"/>
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <ContentControl Content="{Binding}">
                <ContentControl.Style>
                    <Style TargetType="{x:Type ContentControl}">
                        <Setter Property="ContentTemplate" Value="{StaticResource ItemLeft}"/>
                        <Style.Triggers>
                            <DataTrigger Binding="{Binding RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type ContentPresenter}}, Path=(ItemsControl.AlternationIndex)}" Value="1">
                                <Setter Property="ContentTemplate" Value="{StaticResource ItemRight}"/>                                      
                            </DataTrigger>
                        </Style.Triggers>
                    </Style>
                </ContentControl.Style>
            </ContentControl>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

答案 1 :(得分:1)

更简单的解决方案是设置ItemContainerStyle,并为AlternationIndex使用Trigger而不是DataTrigger:

<ItemsControl ... AlternationCount="2">
    <ItemsControl.ItemContainerStyle>
        <Style TargetType="ContentPresenter">
            <Setter Property="ContentTemplate" Value="{StaticResource ItemLeft}"/>
            <Style.Triggers>
                <Trigger Property="ItemsControl.AlternationIndex" Value="1">
                    <Setter Property="ContentTemplate"
                            Value="{StaticResource ItemRight}"/>
                </Trigger>
            </Style.Triggers>
        </Style>
    </ItemsControl.ItemContainerStyle>
    ...
</ItemsControl>