105 votos

¿Datatrigger donde el valor no es nulo?

Sé que se puede hacer un setter que comprueba si un valor es NULO y hacer algo. Ejemplo:

<TextBlock>
  <TextBlock.Style>
    <Style>
      <Style.Triggers>
        <DataTrigger Binding="{Binding SomeField}" Value="{x:Null}">
          <Setter Property="TextBlock.Text" Value="It's NULL Baby!" />
        </DataTrigger>
      </Style.Triggers>
    </Style>
  </TextBlock.Style>
</TextBlock>

Pero, ¿cómo puedo comprobar si un "no" valor... como en "NO NULO", o "NO = 3"? Es posible que en XAML?

Resultados: Gracias por sus respuestas... yo sabía que podía hacer un convertidor de valores (lo que significa que tendría que ir en el código, y que no sería pura XAML como yo esperaba). Sin embargo, eso no responder a la pregunta que efectivamente "no" no se puede hacer en puro XAML. La respuesta seleccionada, sin embargo, muestra que probablemente la mejor manera de crear este tipo de funcionalidad. Buen hallazgo.

98voto

Robert Macnee Puntos 6998

Puede utilizar un IValueConverter para esto:

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

Donde IsNullConverter se define en otra parte (y conv se establece en referencia a su espacio de nombres):

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.");
    }
}

Una solución más general sería implementar un IValueConverter que comprueba la igualdad con el ConverterParameter, así que usted puede comprobar contra cualquier cosa, y no sólo null.

27voto

J c Puntos 3498

Me encontré con una limitación similar con DataTriggers, y parece que sólo se puede comprobar la igualdad. Lo más parecido que he visto que te podría ayudar es una técnica para hacer otros tipos de comparaciones otros de la igualdad.

Este blog describe cómo realizar comparaciones tales como LT, GT, etc en un DataTrigger.

Esta limitación de la DataTrigger puede ser solucionado en cierta medida por el uso de un Convertidor de masaje los datos en un valor especial a continuación, puede comparar contra, como sugiere Robert Macnee la respuesta.

12voto

SteveCav Puntos 3860

Estoy usando esto para permitir sólo un botón si se selecciona un elemento del control listview (es decir, no null):

<Style TargetType="{x:Type Button}">
    <Setter Property="IsEnabled" Value="True"/>
    <Style.Triggers>
        <DataTrigger Binding="{Binding ElementName=lvMyList, Path=SelectedItem}" Value="{x:Null}">
            <Setter Property="IsEnabled" Value="False"/>
        </DataTrigger>
    </Style.Triggers>
</Style>

11voto

JoanComasFdz Puntos 1019

Comparar con nula (Como dijo Michael Noonan):

 <Style>
    <Style.Triggers>
       <DataTrigger Binding="{Binding SomeProperty}" Value="{x:Null}">
           <Setter Property="Visibility" Value="Collapsed" />
        </DataTrigger>
     </Style.Triggers>
</Style>
 

Comparar con no nulo (sin convertidor):

 <Style>
    <Setter Property="Visibility" Value="Collapsed" />
    <Style.Triggers>
       <DataTrigger Binding="{Binding SomeProperty}" Value="{x:Null}">
           <Setter Property="Visibility" Value="Visible" />
        </DataTrigger>
     </Style.Triggers>
</Style>
 

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X