151 votes

DataTrigger où la valeur n'est PAS nulle ?

Je sais que je peux faire un setter qui vérifie si une valeur est NULL et faire quelque chose. Exemple :

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

Mais comment puis-je vérifier une valeur "non"... comme dans "NOT NULL", ou "NOT = 3" ? Est-ce possible en XAML ?

Résultats : Merci pour vos réponses... Je savais que je pouvais faire un convertisseur de valeur (ce qui signifie que je devrais aller dans le code, et ce ne serait pas du pur XAML comme je l'espérais). Cependant, cela répond à la question qu'effectivement "non" vous ne pouvez pas le faire en XAML pur. La réponse choisie, cependant, montre probablement la meilleure façon de créer ce genre de fonctionnalité. Bonne trouvaille.

175voto

C'est un peu une tricherie, mais j'ai simplement défini un style par défaut et je l'ai ensuite remplacé par un DataTrigger si la valeur est nulle...

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

144voto

Robert Macnee Points 6998

Vous pouvez utiliser un IValueConverter pour cela :

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

Où IsNullConverter est défini ailleurs (et conv est défini pour faire référence à son espace de nom) :

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

Une solution plus générale serait d'implémenter un IValueConverter qui vérifie l'égalité avec le ConverterParameter, de sorte que vous puissiez vérifier n'importe quoi, et pas seulement null.

40voto

J c Points 3498

J'ai rencontré une limitation similaire avec les DataTriggers, et il semblerait que vous ne puissiez vérifier que l'égalité. La chose la plus proche que j'ai vue qui pourrait vous aider est une technique pour faire d'autres types de comparaisons que l'égalité.

Cet article de blog décrit comment effectuer des comparaisons telles que LT, GT, etc. dans un DataTrigger.

Cette limitation du DataTrigger peut être contournée dans une certaine mesure en utilisant un convertisseur pour transformer les données en une valeur spéciale à laquelle vous pouvez ensuite comparer, comme le suggère la réponse de Robert Macnee.

23voto

JoanComasFdz Points 1019

Comparez avec la nullité (comme l'a dit Michael Noonan) :

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

Comparer avec non nul (sans convertisseur) :

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

15voto

yossharel Points 609

Vous pouvez utiliser DataTrigger classe dans Microsoft.Expression.Interactions.dll qui viennent avec Mélange d'expression .

Exemple de code :

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

En utilisant cette méthode, vous pouvez déclencher contre GreaterThan y LessThan aussi. Afin d'utiliser ce code, vous devez référencer deux dll :

System.Windows.Interactivity.dll

Microsoft.Expression.Interactions.dll

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X