非空字符串时的触发条件

本文关键字:条件 字符串 | 更新日期: 2023-09-27 18:04:37

我们可以检查一些控件的字符串属性是空的,像下面的代码:

<Trigger SourceName="atCaption" Property="Text" Value="{x:Static sys:String.Empty}">
    <Setter TargetName="imgBack" Property="Margin" Value="0"/>
    <Setter TargetName="atCaption" Property="Margin" Value="0"/>
</Trigger>

但是,如何定义一个基于'非空'字符串的条件?

<!--unfortunately, can't accept '!=' operator in xaml.-->
<Trigger SourceName="atCaption" Property="Text" Value!="{x:Static sys:String.Empty}">
    <Setter TargetName="imgBack" Property="Margin" Value="0"/>
    <Setter TargetName="atCaption" Property="Margin" Value="0"/>
</Trigger>

非空字符串时的触发条件

通过WPF-it来增加答案(对我来说这是一个永久的解决方案,而不是快速修复)

    <DataTrigger Binding="{Binding VolumeGroup}" Value="{x:Null}">
        <Setter Property="Background" Value="{StaticResource DataGridBackground}" />
    </DataTrigger>
    <DataTrigger Binding="{Binding VolumeGroup}" Value="">
        <Setter Property="Background" Value="{StaticResource DataGridBackground}" />
    </DataTrigger>
</Style.Triggers>
<!--inverted rare case: VolumeGroup will usually be empty so cells will be {StaticResource DataGridBackground}-->
<Setter Property="Background" Value="DarkOliveGreen" />

使用ValueConverter是一个解决方案。

当使用MVVM时,你可以考虑在你绑定的ViewModel类上添加一个额外的属性,该属性决定了控件应该如何显示。

当我使用mvvm解决这个问题的方式时,我不需要触发器,我只需要向ViewModel添加额外的属性,并将视图的属性绑定到这些额外的属性来操作视图

为了快速解决这个问题,应用于反向条件的值应该在元素声明或样式中默认,然后使用直接相等条件来更改值。

假设margin 5是你为空字符串设置的,0是你必须为非空字符串设置的,那么你将默认设置0作为Style中的简单Setter,然后使用Trigger检查空字符串并设置5。确保在Style.

中默认的Setter(适用于0)出现在Trigger(适用于5)之前。

如果你使用数据触发器,它使用绑定语法,所以你可以使用IValueConverter类将属性转换为布尔值。您可以在自定义IValueConverter内的代码中编写您想要发生的检查。