根据索引更改ListBoxItem的颜色

时间:2015-03-24 19:53:35

标签: wpf indexing listbox listboxitem

我正在尝试根据索引值更改ListBox中某个项目的前景(文本)颜色。例如,如果索引为1,则索引1处的项目将具有与所有其他项目不同的文本颜色。索引不是列表选择索引,而是我自己的值。

我在Google上搜索并发现了一些使用AlternationIndex的想法,但是我无法使用它。转换器接收0(零)或DependencyProperty #Unset为AlternationIndex绑定。

这是我的代码:

<ListBox x:Name="videoList" SelectionMode="Single" AlternationCount="{Binding Mode=OneWay, Path=Items.Count}" Grid.Column="1" SelectionChanged="videoList_SelectionChanged">
    <ListBox.ItemContainerStyle>
        <Style TargetType="{x:Type ListBoxItem}">
            <Style.Triggers>
                <DataTrigger Value="True">
                    <DataTrigger.Binding>
                        <MultiBinding Mode="OneWay" Converter="{StaticResource EqualityConverter}">
                            <MultiBinding.Bindings>
                                <Binding ElementName="videoWindow" Mode="OneWay" Path="VideoIndex" />
                                <Binding RelativeSource="{RelativeSource AncestorType=ListBoxItem}" Path="(ItemsControl.AlternationIndex)" />
                            </MultiBinding.Bindings>
                        </MultiBinding>
                    </DataTrigger.Binding>
                    <DataTrigger.Setters>
                        <Setter Property="Foreground" Value="Blue" />
                    </DataTrigger.Setters>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </ListBox.ItemContainerStyle>
</ListBox>

对于RelativeSource,我尝试过:Self,TemplatedParent和AncestorType = ListBoxItem。 我还尝试了许多与Path值不同的组合。

我无法让它发挥作用。有什么建议吗?

解决方案:在Clemens的帮助下,结果是因为ListBox AlternationCount的绑定不正确。糟糕!

<ListBox x:Name="videoList" 
         SelectionMode="Single" 
         AlternationCount="{Binding RelativeSource={RelativeSource Self}, Mode=OneWay, Path=Items.Count}" 
         Grid.Column="1" 
         SelectionChanged="videoList_SelectionChanged">
    <ListBox.ItemContainerStyle>
        <Style TargetType="{x:Type ListBoxItem}">
            <Style.Triggers>
                <DataTrigger Value="True">
                    <DataTrigger.Binding>
                        <MultiBinding Mode="OneWay" Converter="{StaticResource EqualityConverter}">
                            <MultiBinding.Bindings>
                                <Binding ElementName="videoWindow" Mode="OneWay" Path="VideoIndex" />
                                <Binding RelativeSource="{RelativeSource Self}" Path="(ItemsControl.AlternationIndex)" />
                            </MultiBinding.Bindings>
                        </MultiBinding>
                    </DataTrigger.Binding>
                    <Setter Property="Foreground" Value="Blue" />
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </ListBox.ItemContainerStyle>
</ListBox>

1 个答案:

答案 0 :(得分:1)

适用于RelativeSource Self和足够大的AlternationCount,例如int.MaxValue

<ListBox AlternationCount="2147483647" ...>
    <ListBox.ItemContainerStyle>
        <Style TargetType="{x:Type ListBoxItem}">
            <Style.Triggers>
                <DataTrigger Value="True">
                    <DataTrigger.Binding>
                        <MultiBinding Converter="{StaticResource EqualityConverter}">
                            <MultiBinding.Bindings>
                                <Binding ElementName="videoWindow"
                                         Path="VideoIndex"/>
                                <Binding RelativeSource="{RelativeSource Self}"
                                         Path="(ItemsControl.AlternationIndex)"/>
                            </MultiBinding.Bindings>
                        </MultiBinding>
                    </DataTrigger.Binding>
                    <DataTrigger.Setters>
                        <Setter Property="Foreground" Value="Blue"/>
                    </DataTrigger.Setters>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </ListBox.ItemContainerStyle>
</ListBox>