列表框内容控件在alternationindex,xaml上有两个数据模板和触发器

时间:2015-02-09 18:24:56

标签: wpf xaml

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

定义模板:

<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>

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

列表框:

        <ListBox Name="StatusListBox" AlternationCount="2">
            <ListBox.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=(ListBox.AlternationIndex)}" Value="1">
                                        <Setter Property="ContentTemplate" Value="{StaticResource ItemRight}"/>
                                    </DataTrigger>
                                </Style.Triggers>
                            </Style>
                        </ContentControl.Style>
                    </ContentControl>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>

此代码未正确设置内容控件。我要么做错了,要么又错过了一步。我是使用WPF的新手,我发现其中大部分都非常直观,但我迷失在这里。我想尝试将其包含在XAML代码中。

由于

1 个答案:

答案 0 :(得分:3)

您可以直接设置ItemContainerStyle,而不是在ItemTemplate中设置ContentPresenter的样式。对于AlternationIndex,样式将有Trigger而不是DataTrigger

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