ContentStringFormat 在 DataTrigger 中永远不会被 Setter 属性 改变

ContentStringFormat never changes by Setter Property in DataTrigger

在我的用户控件中,我希望标签根据视图模型 属性 位置值和不同格式显示来自资源的文本。 我通过为每个 Location 值

定义 DataTrigger 来实现它
<Style x:Key="LocationValueHelper" TargetType="{x:Type Label}">
    <Style.Triggers>
        <DataTrigger Binding="{Binding Location}" Value="HomeViewModel">
            <Setter Property="Content" Value="" />
            <Setter Property="ContentStringFormat" Value="{}{0}???"/>
        </DataTrigger>
        <DataTrigger Binding="{Binding Location}" Value="FirstViewModel">
            <Setter Property="ContentStringFormat" Value="{}{0}+++"/>
            <Setter Property="Content" Value="{localization:LanguageResource ResourceKey=First}" />
        </DataTrigger>
        <DataTrigger Binding="{Binding Location}" Value="SecondViewModel">
            <Setter Property="ContentStringFormat" Value="{}{0}---"/>
            <Setter Property="Content" Value="{localization:LanguageResource ResourceKey=Second}" />
        </DataTrigger>
        <DataTrigger Binding="{Binding Location}" Value="ThirdViewModel">
            <Setter Property="ContentStringFormat" Value="{}{0}***"/>
            <Setter Property="Content" Value="{localization:LanguageResource ResourceKey=Third}" />
        </DataTrigger>
    </Style.Triggers>
</Style>


<Label Foreground="White" HorizontalAlignment="Center" FontSize="40" Style="{StaticResource LocationValueHelper}" />

问题是格式从第一个开始就不会改变 (???) - 首先选择 HomeViewModel - 尽管文本更改有效。

我有

Home???
First???
Second???
Third???

而不是

Home???
First+++
Second---
Third***

有很多讨论,使用标签和 ContentStringFormat 没有像预期或期望的那样工作:

原因似乎是幕后基于模板的实现,因为内容还可能包含字符串以外的其他数据。为了解决您的问题,我的建议是使用 TextBlock,它工作起来非常流畅,如下所示:

<StackPanel>
    <CheckBox IsChecked="{Binding MyFlag}"/>
    <TextBlock HorizontalAlignment="Center" FontSize="40">
        <TextBlock.Style>
            <Style TargetType="{x:Type TextBlock}">
                <Style.Triggers>
                    <DataTrigger Binding="{Binding MyFlag}" Value="False">
                        <Setter Property="Text" Value="{Binding Path=MyText, StringFormat='{}{0}+++'}" />
                    </DataTrigger>
                    <DataTrigger Binding="{Binding MyFlag}" Value="True">
                        <Setter Property="Text" Value="{Binding Path=MyText, StringFormat='{}{0}???'}" />
                    </DataTrigger>
                </Style.Triggers>
            </Style>
        </TextBlock.Style>
    </TextBlock>
</StackPanel>