在 Setter 中覆盖文本 属性(或更好的方法)

Overwrite Text property in a Setter (or a better approach)

我正在为在 WPF XAML 中复制 switch 而苦苦挣扎,我想在其中分层进行一些绑定并将我的文本 属性 设置为我得到的最后一个真实值.

<TextBlock Grid.Row="4" Grid.Column="2">
  <Run Text="No hits"/>
  <TextBlock.Style>
    <Style>
      <Style.Triggers>
        <DataTrigger Binding="{Binding FirstValue}" Value="True">
          <Setter Property="TextBlock.Text" Value="FirstValueHit"/>
        </DataTrigger>
        <DataTrigger Binding="{Binding SecondValue}" Value="True">
          <Setter Property="TextBlock.Text" Value="SecondValueHit"/>
        </DataTrigger>
        <DataTrigger Binding="{Binding ThirdValue}" Value="True">
          <Setter Property="TextBlock.Text" Value="ThirdValueHit"/>
        </DataTrigger>
      </Style.Triggers>
    </Style>
  </TextBlock.Style>
</TextBlock>

我的问题是,如果所有 3 个命中,我将以字符串 "No hits FirstValueHit SecondValueHit ThirdValueHit" 结束。

有没有一种简单的方法可以覆盖之前的 TextBlock.Text 属性,例如,如果我要更改前景颜色,它就会覆盖。

如果我有 Foreground="Red" 然后在 setter 上将其设置为黄色,我会得到黄色前景,而不是橙色前景(红色加黄色)。

或者是否有更好的方法让它表现得像一个开关,只需翻转顺序并在它被击中时中断?

TextBlock.Text 有点特殊,因为它只是处理 TextBlock.Inlines 的一种便捷方式。这就是为什么您会看到组合 No hits FirstValueHit SecondValueHit ThirdValueHit 的神器。但是,只要您不想处理多个 Run 元素,就可以像处理任何其他 属性.

一样处理它

基本上,在样式中而不是直接在控件中设置属性。否则本地值将覆盖样式触发结果。此外,设置 Style.TargetType 以便直接访问目标类型属性。

<TextBlock Grid.Row="4" Grid.Column="2">
  <TextBlock.Style>
    <Style TargetType="TextBlock">
      <Setter Property="Text" Value="No hits"/>
      <Style.Triggers>
        <DataTrigger Binding="{Binding FirstValue}" Value="True">
          <Setter Property="Text" Value="FirstValueHit"/>
        </DataTrigger>
        <DataTrigger Binding="{Binding SecondValue}" Value="True">
          <Setter Property="Text" Value="SecondValueHit"/>
        </DataTrigger>
        <DataTrigger Binding="{Binding ThirdValue}" Value="True">
          <Setter Property="Text" Value="ThirdValueHit"/>
        </DataTrigger>
      </Style.Triggers>
    </Style>
  </TextBlock.Style>
</TextBlock>