将StyleSelector与ItemContainerStyle一起使用

时间:2015-10-14 16:37:21

标签: c# wpf xaml

我有一个ListBoxItemsSource只是一个字符串列表。我有一个改变ListBoxItem s模板的样式 这是:

<Style x:Key="MyStyleBase" TargetType="{x:Type ListBoxItem}" >
    <Setter Property="Margin" Value="2" />
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type ListBoxItem}">
                <StackPanel x:Name="stackPanel">
                    <CheckBox Focusable="False"
                    IsChecked="{Binding Path=IsSelected, Mode=TwoWay,
                    RelativeSource={RelativeSource TemplatedParent} }">
                        <ContentPresenter/>
                    </CheckBox>
                </StackPanel>
                <ControlTemplate.Triggers>
                    <Trigger Property="ItemsControl.AlternationIndex" Value="1">
                        <Setter TargetName="stackPanel" Property="Background" Value="LightBlue" />
                    </Trigger>
                    <Trigger Property="IsSelected" Value="True">
                        <Setter TargetName="stackPanel" Property="Background" Value="Red"/>
                    </Trigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

我使用其他样式将此样式应用于ListBox

<Style x:Key="Style" TargetType="ListBox">
    <Setter Property="AlternationCount" Value="2"/>
    <Setter Property="ItemContainerStyle" Value="{StaticResource MyStyleBase}"/>
</Style>

现在这很好用,直到我希望根据它的字符串值更改每个ListBoxItem的文本的前景。 我正在使用StyleSelector

class MyStyleSelector : StyleSelector
{
    public override Style SelectStyle(object item, DependencyObject container)
    {
        if((string)item == "Avatar")
            return Application.Current.MainWindow.FindResource("MyStyleBlue") as Style;
        return Application.Current.MainWindow.FindResource("MyStyleBlack") as Style;
    }
}

以下是我的MyStyleBlueMyStyleBlack

<Style x:Key="MyStyleBlack" BasedOn="{StaticResource MyStyleBase}" TargetType="{x:Type ListBoxItem}">
    <Setter Property="Foreground" Value="Black"></Setter>
</Style>

<Style x:Key="MyStyleBlue" BasedOn="{StaticResource MyStyleBase}" TargetType="{x:Type ListBoxItem}">
    <Setter Property="Foreground" Value="Blue"></Setter>
</Style>

ListBoxItem中有字符串“Avatar”时,它不起作用。它只显示通常的MyStyleBase(前景不变)。但如果StyleSelector是“头像”,则MyStyleBlue应该将样式更改为ListBoxItemMyStyleBlue应该将前景改为蓝色(但事实并非如此)。我究竟做错了什么?

我看到this question表示如果设置了StyleSelectorItemContainerStyle将不起作用。但是,如何将StyleSelectorItemContainerStyle设置一起使用?还有其他办法可以做我想做的事吗?

1 个答案:

答案 0 :(得分:1)

使用ItemStyleSelector时,从StyleSelector返回项目样式,因此同时设置ItemContainerStyle无效。

但是,这并不重要,因为您从MyStyleSelector返回的样式已基于MyStyleBase。完全没有必要将ItemContainerStyle设置为MyStyleBase