【问题标题】: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>

【问题讨论】:

标签: c# wpf xaml triggers


【解决方案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 内的代码中编写要进行的检查。

      【讨论】:

        猜你喜欢
        • 2021-06-23
        • 1970-01-01
        • 2017-06-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多