DataTrigger where value is NOT null? DataTrigger where value is NOT null? wpf wpf

DataTrigger where value is NOT null?


This is a bit of a cheat but I just set a default style and then overrode it using a DataTrigger if the value is null...

  <Style>       <!-- Highlight for Reviewed (Default) -->      <Setter Property="Control.Background" Value="PaleGreen" />       <Style.Triggers>        <!-- Highlight for Not Reviewed -->        <DataTrigger Binding="{Binding Path=REVIEWEDBY}" Value="{x:Null}">          <Setter Property="Control.Background" Value="LightIndianRed" />        </DataTrigger>      </Style.Triggers>  </Style>


You can use an IValueConverter for this:

<TextBlock>    <TextBlock.Resources>        <conv:IsNullConverter x:Key="isNullConverter"/>    </TextBlock.Resources>    <TextBlock.Style>        <Style>            <Style.Triggers>                <DataTrigger Binding="{Binding SomeField, Converter={StaticResource isNullConverter}}" Value="False">                    <Setter Property="TextBlock.Text" Value="It's NOT NULL Baby!"/>                </DataTrigger>            </Style.Triggers>        </Style>    </TextBlock.Style></TextBlock>

Where IsNullConverter is defined elsewhere (and conv is set to reference its namespace):

public class IsNullConverter : IValueConverter{    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)    {        return (value == null);    }    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)    {        throw new InvalidOperationException("IsNullConverter can only be used OneWay.");    }}

A more general solution would be to implement an IValueConverter that checks for equality with the ConverterParameter, so you can check against anything, and not just null.


I ran into a similar limitation with DataTriggers, and it would seem that you can only check for equality. The closest thing I've seen that might help you is a technique for doing other types of comparisons other than equality.

This blog post describes how to do comparisons such as LT, GT, etc in a DataTrigger.

This limitation of the DataTrigger can be worked around to some extent by using a Converter to massage the data into a special value you can then compare against, as suggested in Robert Macnee's answer.