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.

14voto

SteveCav Points 3860

Je l'utilise pour activer un bouton uniquement si un élément de la liste est sélectionné (c'est-à-dire non nul) :

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

6voto

aromore Points 127
<StackPanel.Style>
  <Style>
    <Setter Property="StackPanel.Visibility" Value="Visible"></Setter>
    <Style.Triggers>
      <DataTrigger  Binding="{Binding ElementName=ProfileSelectorComboBox, Path=SelectedItem.Tag}" Value="{x:Null}">
          <Setter Property="StackPanel.Visibility" Value="Collapsed"></Setter>
      </DataTrigger>
    </Style.Triggers>
  </Style>
</StackPanel.Style>

J'ai juste utilisé la logique inverse ici... en rendant mon stackpanel invisible lorsque mon comboitem n'est pas rempli, cela fonctionne plutôt bien !

6voto

Simon Points 1720

Stop ! Pas de convertisseur ! Je ne veux pas "vendre" la bibliothèque de ce type, mais je détestais le fait de faire un convertisseur à chaque fois que je voulais comparer des choses dans XAML.

Donc avec cette bibliothèque : https://github.com/Alex141/CalcBinding

vous pouvez faire cela [et bien plus encore] :

Tout d'abord, dans la déclaration de l'élément Windows/userControl :

<Windows....
     xmlns:conv="clr-namespace:CalcBinding;assembly=CalcBinding"
>

puis, dans le bloc de texte

<TextBlock>
      <TextBlock.Style>
          <Style.Triggers>
          <DataTrigger Binding="{conv:Binding 'MyValue==null'}" Value="false">
             <Setter Property="Background" Value="#FF80C983"></Setter>
          </DataTrigger>
        </Style.Triggers>
      </TextBlock.Style>
    </TextBlock>

La partie magique est le conv:Binding 'MYValue==null' (liaison) . En fait, vous pouviez définir toutes les conditions que vous vouliez [voir le document].

Notez que je ne suis pas un fan des tiers, mais cette bibliothèque est gratuite et a peu d'impact (il suffit d'ajouter 2 .dll au projet).

5voto

APaglia Points 23

Ma solution se trouve dans l'instance DataContext (ou ViewModel si vous utilisez MVVM). J'ajoute une propriété qui renvoie true si la condition Not Null que je veux est remplie.

    Public ReadOnly Property IsSomeFieldNull() As Boolean
        Get
            Return If(SomeField is Null, True, False)
        End Get
    End Property

et lier le DataTrigger à la propriété ci-dessus. Remarque : en VB.NET, veillez à utiliser l'opérateur If et NON la fonction IIf, qui ne fonctionne pas avec les objets Null. Alors le XAML est :

    <DataTrigger Binding="{Binding IsSomeFieldNull}" Value="False">
      <Setter Property="TextBlock.Text" Value="It's NOT NULL Baby!" />
    </DataTrigger>

3voto

Si vous recherchez une solution qui n'utilise pas IValueConverter, vous pouvez toujours opter pour le mécanisme suivant

       <StackPanel>
            <TextBlock Text="Border = Red when null value" />
            <Border x:Name="border_objectForNullValueTrigger" HorizontalAlignment="Stretch" Height="20"> 
                <Border.Style>
                    <Style TargetType="Border">
                        <Setter Property="Background" Value="Black" />
                        <Style.Triggers>
                            <DataTrigger Binding="{Binding ObjectForNullValueTrigger}" Value="{x:Null}">
                                <Setter Property="Background" Value="Red" />
                            </DataTrigger>
                        </Style.Triggers>
                    </Style>
                </Border.Style>
            </Border>
            <TextBlock Text="Border = Green when not null value" />
            <Border HorizontalAlignment="Stretch" Height="20">
                <Border.Style>
                    <Style TargetType="Border">
                        <Setter Property="Background" Value="Green" />
                        <Style.Triggers>
                            <DataTrigger Binding="{Binding Background, ElementName=border_objectForNullValueTrigger}" Value="Red">
                                <Setter Property="Background" Value="Black" />
                            </DataTrigger>
                        </Style.Triggers>
                    </Style>
                </Border.Style>
            </Border>
            <Button Content="Invert Object state" Click="Button_Click_1"/>
        </StackPanel>

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