在 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>
我正在为在 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>