it-swarm.com.de

DataTrigger wo Wert NICHT null ist?

Ich weiß, dass ich einen Setter erstellen kann, der prüft, ob ein Wert NULL ist, und etwas unternimmt. Beispiel:

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

Aber wie kann ich nach einem "Nicht" -Wert suchen ... wie in "NICHT NULL" oder "NICHT = 3"? Ist das in XAML möglich?

Results: Vielen Dank für Ihre Antworten ... Ich wusste, dass ich einen Wertekonverter machen könnte (was bedeutet, dass ich in Code gehen müsste, und das wäre nicht reines XAML, wie ich es mir erhofft hatte). Dies beantwortet jedoch die Frage, dass Sie dies in reinem XAML mit "Nein" nicht können. Die ausgewählte Antwort zeigt jedoch wahrscheinlich den besten Weg, um diese Art von Funktionalität zu erzeugen . Guter Fund.

148
Timothy Khouri

Ich bin mit DataTriggers auf eine ähnliche Einschränkung gestoßen, und es scheint, dass Sie nur auf Gleichheit prüfen können. Das Nächste, was ich gesehen habe, das Ihnen helfen könnte, ist eine Technik, mit der Sie andere Vergleiche als Gleichheit anstellen können.

Dieser Blog-Beitrag beschreibt, wie Vergleiche wie LT, GT usw. in einem DataTrigger durchgeführt werden.

Diese Einschränkung des DataTriggers kann in gewissem Maße umgangen werden, indem ein Konverter verwendet wird, um die Daten auf einen bestimmten Wert zu massieren, mit dem Sie dann vergleichen können, wie in der Antwort von Robert Macnee vorgeschlagen.

36
J c

Sie können dazu einen IValueConverter verwenden:

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

Wo IsNullConverter an anderer Stelle definiert ist (und conv so eingestellt ist, dass es auf seinen Namespace verweist):

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

Eine allgemeinere Lösung wäre, einen IValueConverter zu implementieren, der auf Gleichheit mit dem ConverterParameter prüft, sodass Sie gegen alles und nicht nur gegen Null prüfen können.

140
Robert Macnee

Dies ist ein kleiner Cheat, aber ich habe nur einen Standardstil festgelegt und ihn dann mit einem DataTrigger überschrieben, wenn der Wert null ist ...

  <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>
136
Michael Noonan

Vergleichen Sie mit null (wie Michael Noonan sagte):

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

Vergleichen Sie mit not null (ohne Konverter):

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

Sie können die Klasse DataTrigger in Microsoft.Expression.Interactions.dll verwenden, die mit Expression Blend geliefert wird.

Codebeispiel:

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

Mit dieser Methode können Sie auch gegen GreaterThan und LessThan triggern. Um diesen Code zu verwenden, sollten Sie auf zwei DLLs verweisen:

System.Windows.Interactivity.dll

Microsoft.Expression.Interactions.dll

14
yossharel

Ich verwende dies, um eine Schaltfläche nur zu aktivieren, wenn ein Listenansichtselement ausgewählt ist (dh nicht 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>
14
SteveCav
<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>

Ich habe hier nur die umgekehrte Logik verwendet ... und mein Stackpanel auf unsichtbar gesetzt, wenn mein Kombinationselement nicht gefüllt ist, funktioniert es ziemlich gut!

6
aromore

Halt! Kein Konverter! Ich wollte die Bibliothek dieses Typen nicht "verkaufen", aber ich hasste die Tatsache, dass ich jedes Mal Konverter machte, wenn ich Dinge in XAML vergleichen wollte.

Also mit dieser Bibliothek: https://github.com/Alex141/CalcBinding

das kannst du [und noch viel mehr]:

Zunächst in der Deklaration von windows/userControl:

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

dann im Textblock

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

Der magische Teil ist der Conv: Binding 'MYValue == null' . Tatsächlich können Sie jede gewünschte Bedingung festlegen [siehe Dokument].

beachte, dass ich kein Fan von Dritten bin. Diese Bibliothek ist jedoch kostenlos und hat nur geringe Auswirkungen (fügen Sie einfach 2 .dll zum Projekt hinzu).

5
Simon

Meine Lösung befindet sich in der DataContext-Instanz (oder ViewModel, wenn MVVM verwendet wird). Ich füge eine Eigenschaft hinzu, die true zurückgibt, wenn die gewünschte Not-Null-Bedingung erfüllt ist.

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

und binden Sie den DataTrigger an die obige Eigenschaft. Hinweis: Verwenden Sie in VB.NET unbedingt den Operator If und NICHT die IIf-Funktion, die bei Null-Objekten nicht funktioniert. Dann ist die XAML:

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

Wenn Sie nach einer Lösung suchen, die IValueConverter nicht verwendet, können Sie immer den folgenden Mechanismus verwenden

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

Sie können einen Konverter verwenden oder eine neue Eigenschaft in Ihrem ViewModel erstellen:

public bool CanDoIt
{
    get
    {
        return !string.IsNullOrEmpty(SomeField);
    }
}

und benutze es:

<DataTrigger Binding="{Binding SomeField}" Value="{Binding CanDoIt}">
2
Butsaty

Konverter:

public class NullableToVisibilityConverter: IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return value == null ? Visibility.Collapsed : Visibility.Visible;
    }
}

Bindung:

Visibility="{Binding PropertyToBind, Converter={StaticResource nullableToVisibilityConverter}}"
2
abatishchev