【问题标题】:WPF Select ComboBox text style based on variableWPF 根据变量选择 ComboBox 文本样式
【发布时间】:2021-03-16 17:51:17
【问题描述】:

我有一个ComboBox,我希望能够根据ComboBoxItem 的属性更改ComboBoxItem 内的文本样式。

<ComboBox ItemsSource="{Binding Countries}">
    <ComboBox.ItemTemplate>
        <DataTemplate>
            <ContentControl Content="{Binding}" Focusable="False">
                <ContentControl.Style>
                    <Style TargetType="{x:Type ContentControl}">
                        <Setter Property="ContentTemplate">
                            <Setter.Value>
                                <DataTemplate>
                                    <TextBlock Text="{Binding Name}" Style="{StaticResource MyStyle}" />
                                </DataTemplate>
                            </Setter.Value>
                        </Setter>
                    </Style>
                </ContentControl.Style>
            </ContentControl>
        </DataTemplate>
    </ComboBox.ItemTemplate>

如果 Country 的属性 IsWestern 为真,我一直在尝试将 TextBlock 样式从 MyStyle 设置为不同的样式,但我没有管理。我想我在某个地方需要一个Trigger,但我想不通并添加了一个品种,但到目前为止都没有。

【问题讨论】:

    标签: wpf xaml data-binding


    【解决方案1】:

    使用 DataTrigger 更改 ContentTemplate:

    <Style TargetType="{x:Type ContentControl}">
        <Setter Property="ContentTemplate">
            <Setter.Value>
                <DataTemplate>
                    <TextBlock Text="{Binding Name}" Style="{StaticResource MyStyle}" />
                </DataTemplate>
            </Setter.Value>
        </Setter>
        <Style.Triggers>
            <DataTrigger Binding="{Binding Path=IsWestern}" Value="True">
                <Setter Property="ContentTemplate">
                    <Setter.Value>
                        <DataTemplate>
                            <TextBlock Text="{Binding Name}" Style="{StaticResource WesternStyle}" />
                        </DataTemplate>
                    </Setter.Value>
                </Setter>
            </DataTrigger>
        </Style.Triggers>
    </Style>
    

    或者在 TextBlock 样式 (MyStyle) 中包含 &lt;DataTrigger Binding="{Binding Path=IsWestern}" Value="True"&gt; 并在那里更改所需的 TextBlock 属性:

    <Style x:Key="MyStyle" TargetType="TextBlock">
        <Setter Property="LineStackingStrategy" Value="BlockLineHeight"></Setter>
    
        <Style.Triggers>
            <DataTrigger Binding="{Binding Path=IsWestern}" Value="True">
                <Setter Property="Padding" Value="20,0,0,0"></Setter>
            </DataTrigger>
        </Style.Triggers>
    
    </Style>
    

    【讨论】:

    • 嘿@ASh,感谢您的回复!我尝试了您的代码,但不幸的是,这会覆盖文本块之后的所有其他样式(&lt;Setter.Value&gt; 中还有一些内容我为简单起见省略了。对于您的第二个解决方案,您的意思是要以某种方式更改样式表?
    • 我不明白什么会覆盖什么?没有看到minimal reproducible example 很难给出建议
    • 嘿,阿什,我能用你的第二个建议做到这一点!我会更新你的答案:)
    猜你喜欢
    • 2012-07-09
    • 1970-01-01
    • 2020-03-20
    • 1970-01-01
    • 1970-01-01
    • 2013-01-16
    • 1970-01-01
    • 2014-10-27
    • 1970-01-01
    相关资源
    最近更新 更多