【问题标题】:WPF Trigger not nullWPF 触发器不为空
【发布时间】:2010-11-17 06:56:29
【问题描述】:

当属性不为空时如何在WPF中触发动作? 当 为 null 时,这是一个可行的解决方案:

<Style.Triggers>
    <DataTrigger Binding="{Binding}" Value="{x:Null}">

      <Setter Property="Background" Value="Yellow" />

    </DataTrigger>
</Style.Triggers>

我知道你不能“扭转”这种情况并做你需要做的事情,但想知道

【问题讨论】:

标签: wpf triggers


【解决方案1】:

不幸的是,你不能。但实际上没有必要:您只需要在样式设置器中指定值不为空时的背景,而不是在触发器中:

<Style.Setters>
    <!-- Background when value is not null -->
    <Setter Property="Background" Value="Blue" />
</Style.Setters>
<Style.Triggers>
    <DataTrigger Binding="{Binding}" Value="{x:Null}">

      <Setter Property="Background" Value="Yellow" />

    </DataTrigger>
</Style.Triggers>

【讨论】:

    【解决方案2】:

    您可以在 Expression Blend 附带的 Microsoft.Expression.Interactions.dll 中使用 DataTrigger 类。

    代码示例:

    <i:Interaction.Triggers>
        <ie:DataTrigger Binding="{Binding YourProperty}" Value="{x:Null}" Comparison="NotEqual">
           <ie:ChangePropertyAction PropertyName="YourTargetPropertyName" Value="{Binding YourValue}"/>
        </ie:DataTrigger>
    </i:Interaction.Triggers>
    

    使用此方法,您也可以针对GreaterThanLessThan 触发。 为了使用此代码,您应该引用两个 dll:

    System.Windows.Interactivity.dll
    Microsoft.Expression.Interactions.dll

    并添加相应的命名空间:

    xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"  
    xmlns:ie="http://schemas.microsoft.com/expression/2010/interactions"
    

    【讨论】:

      【解决方案3】:

      这是一个老问题,但我想回答。其实你可以。只是你必须在绑定中使用转换器。转换器必须返回是否为空。所以你会检查语句是真是假。如果返回值为 false,它提供您可以检查两个条件,这意味着它不为 null。如果为真,则表示它为空。

      <converters:IsNullConverter x:Key="IsNullConverterInstance"/>
      
      <Style>
      <Style.Triggers>
          <DataTrigger Binding="{Binding RelativeSource={RelativeSource Self}, Path=DataContext, Converter={StaticResource IsNullConverterInstance}" Value="True">    
            <Setter Property="Background" Value="Yellow" />    
          </DataTrigger>
      </Style.Triggers></Style>
      
      
          public class IsNulConverter: IValueConverter
      {
          public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
          {
      
              return value == null;
          }
      
          public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
          {
      
              return Binding.DoNothing;
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2018-01-14
        • 1970-01-01
        • 2013-02-21
        • 2010-11-09
        • 2011-07-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-03-12
        相关资源
        最近更新 更多