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

时间:2017-11-22 10:10:25

标签: wpf xaml setter textblock datatrigger

我正在努力复制WPF XAML中的switch,我想在其中分层次地检查一些绑定并将我的Text属性设置为我得到的最后一个真值。

<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 hit FirstValueHit SecondValueHit ThirdValueHit”结束。

是否有一种简单的方法可以覆盖之前的TextBlock.Text属性,就像我要更改前景颜色一样。

如果我有Foreground="Red"然后在一个二传手把它变成黄色,我会得到一个黄色的前景,而不是一个橙色的前景(红色加黄色)。

还是有一种更好的方法可以使这个行为像开关一样只是翻转顺序并在它被击中时中断?

1 个答案:

答案 0 :(得分:2)

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>