非空字符串时触发条件

Posted

技术标签:

【中文标题】非空字符串时触发条件【英文标题】:Trigger Condition when Not an Empty String 【发布时间】:2011-10-21 14:06:32 【问题描述】:

我们可以检查一些控件的字符串属性,它已经为空,如下代码:

<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>

【问题讨论】:

类似问题在这里:***.com/questions/356194/… 【参考方案1】:

通过 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" />

【讨论】:

【参考方案2】:

使用 ValueConverter 是一种解决方案。

使用 MVVM 时,您可以考虑绑定到的 ViewModel 类上的一个额外属性,该属性确定控件的显示方式。

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

【讨论】:

我唯一要补充的是,对于 MVVM,其想法是视图模型不应该知道它是如何显示的。相反,视图应该采用视图模型并以它认为合适的方式显示它。例如从纯 MVVM 的角度来看,在你的 VM 上有一个颜色属性来告诉视图显示这个东西的颜色是不好的。 (很明显,在现实世界中,“纯”编程模型往往会有点崩溃,只是想我会指出它;)) @user1080084 - 是的,但我不得不说我也不喜欢 ValueConverters:它是视图中的代码,必须由设计人员应用。这些转换器在 View 和 ViewModel 之间“挂起”。【参考方案3】:

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

例如

假设如果 margin 5 是您为空字符串设置的值,而 0 是您必须为非空字符串设置的值,那么您将默认设置 0 作为 Style 中的简单 Setter,然后使用 Trigger 检查空字符串并设置 5 . 确保默认的 Setter (for 0) 出现在 Style 中 Trigger (for 5) 之前。

【讨论】:

【参考方案4】:

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

【讨论】:

以上是关于非空字符串时触发条件的主要内容,如果未能解决你的问题,请参考以下文章

文本为空字符串时,自动布局UILabel的动态高度计算不起作用?

当变量有时为空或空字符串时,如何使用 CONTAINS()?

传递空字符串时,SQL Server OPENJSON 为日期类型返回 1900-01-01

如何在从数据库中获取空字符串时修复它?

加密空字符串

Elasticsearch多重匹配在提供空字符串时不返回所有结果