WPF:非空字符串时的触发条件

mjk*_*026 13 c# wpf xaml triggers

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

<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>
Run Code Online (Sandbox Code Playgroud)

然后,如何定义一个"非空"字符串的条件?

<!--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>
Run Code Online (Sandbox Code Playgroud)

帮我.

小智 6

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

    <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" />
Run Code Online (Sandbox Code Playgroud)


Ern*_*rno 5

使用ValueConverter是一种解决方案。

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

当我使用MVVM来解决此问题时,我不需要触发器,我只是向ViewModel添加了额外的属性,然后将View的属性绑定到这些额外的属性以操纵View

  • 我唯一要补充的是使用MVVM,其思想是视图模型不应该知道其显示方式。相反,视图应采用视图模型并显示它认为合适的模型。例如,从纯MVVM的角度来看,在VM上具有color属性以告诉视图显示此内容的颜色是不好的。(显然,在现实世界中,“纯粹的”编程模型往往会崩溃一些,只是以为我会指出来;) (4认同)
  • @user1080084 - 是的,但我不得不说我也不喜欢 ValueConverters:它是视图中的代码,必须由设计者应用。这些转换器“挂”在 View 和 ViewModel 之间。 (2认同)

WPF*_*-it 5

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

例如

假设边距 5 是您为空字符串设置的值,而 0 是您必须为非空字符串设置的值,那么您将默认设置 0 作为样式中的简单 Setter,然后使用 Trigger 检查空字符串并设置 5。确保默认设置器(用于 0)出现在样式中的触发器(用于 5)之前。