我正在努力在 WPF XAML 中复制switch
,我想在其中分层地遍历一些绑定(bind)并将我的 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 attempts FirstValueHit SecondValueHit ThirdValueHit”。
是否有一种简单的方法可以使其覆盖之前的 TextBlock.Text
属性,就像我要更改前景色一样。
如果我有 Foreground="Red"
然后在 setter 上将其设置为黄色,我会得到黄色前景,而不是橙色前景(红色加黄色)。
或者有没有更好的方法让它像一个开关一样工作,只需翻转顺序并在命中时中断?
最佳答案
TextBlock.Text
有点特殊,因为它只是处理 TextBlock.Inlines
的便捷方法。这就是为什么您会看到组合的 No attempts 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 - 在 Setter 中覆盖 Text 属性(或更好的方法),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47431875/