【问题标题】:change properties inside datatemplate of listboxItem if selected如果选中,则更改 listboxItem 的数据模板内的属性
【发布时间】:2018-06-07 12:40:09
【问题描述】:

我有以下风格:

<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”的前景色。我从这里知道:Change WPF DataTemplate for ListBox item if selected 如何更改 DataTemplate。但是由于我只想更改颜色,因此此解决方案会在 codd 中产生不必要的重复 - 如果我的 DataTemplate 非常复杂且很长,那将是一个更大的问题。

如何实现DataTemplate内部对象的单个属性的改变?

【问题讨论】:

    标签: wpf xaml


    【解决方案1】:

    如果您实际上总是想要相同的项目模板(无论项目是否被选中),但您希望在项目被选中时使用不同的前景色,这很容易。不要在触发器中设置 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>
    

    【讨论】:

    • 起初我认为它不起作用,因为您更改了“ListBoxItem”的前景属性,而不是“TextBox”。但它确实有效......我想知道为什么,以及如何实现相同的效果,例如,如果您有两个文本框并且您只想更改一个的颜色。
    • @ShacharHar-Shuv 查看更新:我添加了一个模板来演示更多目标触发器,并链接了一篇关于依赖属性值继承的文章。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多