DataTrigger中的Setter属性永远不会更改ContentStringFormat



在我的用户控件中,我希望根据视图模型属性"位置"值和不同的格式,让标签显示资源中的文本。我通过为每个位置值定义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***

有很多讨论,使用Labels和ContentStringFormat并不像预期或期望的那样工作:

标签内容上的WPF StringFormat
  • StringFormat与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>
    

    相关内容

    • 没有找到相关文章

    最新更新