如果选中,则更改listboxItem的datatemplate内的属性

时间:2017-12-26 18:45:36

标签: wpf xaml

我有以下风格:

<Style.Triggers>
            <Trigger Property="IsSelected" Value="True">
                <Setter Property="ContentTemplate">
                    <Setter.Value>
                        <DataTemplate>
                            <TextBlock x:Name="Text" Text="{Binding Name}" Margin="0, 5" FontSize="16"/>
                        </DataTemplate>
                    </Setter.Value>
                </Setter>
            </Trigger> 
        </Style.Triggers>

如果选择“ListBoxItem”,我想更改“Text”的前景色。我从这里知道:Is Android's ARGB_8888 Bitmap internal format always RGBA?如何更改DataTemplate。但是因为我只想改变颜色,这个解决方案在codd中造成了不必要的重复 - 如果我的DataTemplate非常复杂和冗长,这将是一个更大的问题。

如何在DataTemplate中实现对内部单个属性的更改?

1 个答案:

答案 0 :(得分:0)

如果您确实总是想要相同的项目模板(无论该项目是否被选中),但是当您选择该项目时想要不同的前景色,这很容易。不要将ContentTemplate设置为触发器,因为ContentTemplate不会更改。只需使用触发器设置前景色。如果您不熟悉模板中的前景色it will inherit whatever the ListBoxItem has for that property

<Style TargetType="ListBoxItem">
    <Setter Property="ContentTemplate">
        <Setter.Value>
            <DataTemplate>
                <TextBlock 
                    x:Name="Text" 
                    Text="{Binding Name}" 
                    Margin="0, 5" 
                    FontSize="16"
                    />
            </DataTemplate>
        </Setter.Value>
    </Setter>
    <Style.Triggers>
        <Trigger Property="IsSelected" Value="True">
            <Setter Property="Foreground" Value="Red" />
        </Trigger>
    </Style.Triggers>
</Style>

相同风格的更精细版本:

<Style TargetType="ListBoxItem">
    <Setter Property="ContentTemplate">
        <Setter.Value>
            <DataTemplate>
                <StackPanel Orientation="Horizontal">
                    <Ellipse
                        Height="12"
                        Width="12"
                        VerticalAlignment="Center"
                        x:Name="Ellipse"
                        Fill="Yellow"
                        Stroke="DeepSkyBlue"
                        StrokeThickness="1"
                        />
                    <TextBlock 
                        x:Name="Text" 
                        Text="{Binding Name}" 
                        Margin="5,5,0,5" 
                        FontSize="16"
                        />
                </StackPanel>
                <DataTemplate.Triggers>
                    <DataTrigger 
                        Binding="{Binding IsSelected, RelativeSource={RelativeSource AncestorType=ListBoxItem}}"
                        Value="True"
                        >
                        <Setter 
                            TargetName="Ellipse"
                            Property="Stroke"
                            Value="Orange"
                            />
                        <Setter 
                            TargetName="Ellipse"
                            Property="StrokeThickness"
                            Value="3"
                            />
                    </DataTrigger>
                </DataTemplate.Triggers>
            </DataTemplate>
        </Setter.Value>
    </Setter>
    <Style.Triggers>
        <Trigger Property="IsSelected" Value="True">
            <Setter Property="Foreground" Value="Red" />
        </Trigger>
    </Style.Triggers>
</Style>