7 Stimmen

WPF-Trigger-Bindung: Was ist der beste Weg, um einen Enum-Wert an die Sichtbarkeit zu binden?

Ich habe eine Benutzersteuerung ( NameField ). Darin habe ich ein Stackpanel mit 3 Grids: StandardView , FluidView , OtherView . Innerhalb des Code-Behinds habe ich eine DependencyProperty genannt. View vom Typ NameFieldView ( enum ). Die Aufzählung enthält STANDARD , FLUID , OTHER .

Ich glaube, ich muss einen Konverter erstellen, aber ich bin nicht sicher, ob das notwendig ist. Im Grunde möchte ich es so machen, dass das einzige sichtbare Gitter dasjenige ist, das mit dem Enum-Wert übereinstimmt... das heißt, wenn View = NameFieldView.STANDARD dann das Grid namens StandardView sichtbar ist und die beiden anderen nicht.

Außerdem bin ich mir nicht sicher, ob dies ein Teil von Grid.Resources / Style ou Grid.Triggers ?

0 Stimmen

Nebenbemerkung: Seien Sie vorsichtig bei der Verwendung von "Ansicht" als Eigenschaftsname. Es bedeutet eine ziemlich spezifische Sache heutzutage mit dem Model-View-ViewModel-Muster, das bevorzugte modus operandi in der WPF-Welt ist.

0 Stimmen

Ich könnte es "NameFieldVisualState" nennen, denke ich, und VisualState. Aber ja, ich habe die Vorsicht in den Wind geschlagen :)

10voto

Robert Rossney Punkte 91100

Ich verwende dafür Datenauslöser. Es sieht in etwa so aus;

<Style TargetType="DockPanel" x:Key="ViewStyle1">
   <Setter Property="Visibility" Value="Collapsed"/>
   <Style.Triggers>
     <DataTrigger Binding="{Binding ViewStyle}" Value="ViewStyle1">
       <Setter Property="Visibility" Value="Visible"/>
     </DataTrigger>
   </Style.Triggers>
</Style>

Dann erstelle ich eine DockPanel für jeden Ansichtsstil, und wenn die ViewStyle Eigenschaft ändert, wird die entsprechende Ansicht angezeigt.

7voto

Wonko the Sane Punkte 10396

Wie vieles bei WPF hängt es wirklich von Ihrem Geschmack ab. Hier sind ein paar Möglichkeiten.

Sie könnten drei IValueConverter erstellen, die den Wert der Eigenschaft View in eine Visibility umwandeln (oder den Enum-Namen als ConverterParameter verwenden und einen Konverter erstellen).

Sie könnten drei neue Eigenschaften mit den Namen "StandardViewIsVisible", "FluidViewIsVisible" und "OtherViewIsVisible" erstellen, die aktualisiert werden, wenn sich die Eigenschaft View ändert. Diese Eigenschaften wären vom Rückgabetyp Visibility. Dies ist eindeutig mehr ein "MVVM" Weg, Dinge zu tun, auch wenn Sie nicht mit einem ViewModel sind.

Sie könnten einen DataTrigger verwenden, der das entsprechende Raster auf der Grundlage des aktuellen Werts der Eigenschaft "Ansicht" auf "sichtbar" oder "zugeklappt" setzt.

1 Stimmen

Ich ging tatsächlich mit einem ValueConverter und verwendet einen Parameter, um zu entscheiden, welche Ansicht zu überprüfen, gegen. Fluid' prüft, ob View auf Fluid eingestellt ist. Andere" prüft, ob die Ansicht entweder Standard oder Erweitert ist. Und in diesem Raster 2 Combobox-Elemente in 'Extended' übergeben, um zu sehen, wenn View wurde erweitert. Juhu!

1voto

Nathan Kovner Punkte 2113

Ich würde einen Konverter erstellen. Wenn Sie einen Konverter hinzufügen, wann immer Sie ein entsprechendes Bindungsproblem wie dieses haben, werden Sie langsam eine Bibliothek von ihnen für Ihre Anwendung aufbauen, was die Dinge für Sie in Zukunft viel einfacher macht. Ich würde ihn so nennen wie NameFieldViewToVisibilityConverter - er sollte zwei Methoden haben:

public Object Convert(Object value, Type TargetType, Object param, CultureInfo Culture);
public Object ConvertBack(Object value, Type TargetType, Object param, CultureInfo Culture);

Convert hat einen NameFieldView-Parameter und gibt einen Visibility-Wert zurück. ConvertBack hat einen Visibility-Parameter und gibt einen NameFieldView-Wert zurück.

Die Bindungen würden wie folgt aussehen:

<Grid Name="StandardView" Visibility="{Binding View, Converter={StaticResource NameFieldViewToVisibilityConverter}"  />

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X