2010-11-04 4 views
20

Ich möchte Control A sichtbar machen, wenn Control B ausgeblendet ist, und umgekehrt. Im Moment habe ich diesen Konverter:Bindung aus Sichtbarkeit eines anderen Elements - und Invertierung

public class InvertVisibilityConverter : IValueConverter { 

    public Object Convert(Object value, Type targetType, Object parameter, CultureInfo culture) { 
     if (targetType == typeof(Visibility)) { 
      Visibility vis = (Visibility)value; 
      return vis == Visibility.Collapsed ? Visibility.Visible : Visibility.Collapsed; 
     } 
     throw new InvalidOperationException("Converter can only convert to value of type Visibility."); 
    } 

    public Object ConvertBack(Object value, Type targetType, Object parameter, CultureInfo culture) { 
     throw new Exception("Invalid call - one way only"); 
    } 
} 

Und dieses XAML:

<Button Visibility="{Binding ElementName=btn1, Path=Visibility, Converter={StaticResource InvertVisibilityConverter}}">Btn2</Button> 

Welche funktioniert. Ich frage mich nur, ob es einen direkteren Weg in WPF/Silverlight gibt, um das zu erreichen? Es macht mir nichts aus, einen Konverter zu haben, ich möchte nur sicherstellen, dass es keinen besseren Weg gibt, von dem ich nichts weiß.

Antwort

6

Unterm Strich sehe ich kein Problem mit dem, was Sie tun.

Wenn Sie eine Eigenschaft im ViewModel haben, an die sich Control A bindet, um deren Sichtbarkeit zu steuern, würde ich Control B an dieselbe Eigenschaft binden und die Sichtbarkeit über einen separaten Konverter invertieren. Ich bin mir nicht sicher, ob ich den Grund dafür artikulieren kann, aber das erscheint mir natürlicher (zumindest anstelle eines zusätzlichen Zusammenhangs mit dem, was Sie tun).

+0

Es gibt mehr Kontext :) Danke für die Antwort. –

20

In diesem Fall könnten Sie es mit Triggern tun. Beispiel mit zwei Tasten

+1

Danke für die Antwort. Der Style-Trigger erscheint mir etwas umständlicher als der Converter, aber das ist eine Frage der persönlichen Präferenz. –

+0

Ich stimme Ihnen zu. Ich dachte, ich es zu tun eine andere Art und Weise schreiben würde :) –

3

Was Sie tun, ist in Ordnung, aber ich neige dazu, allgemeinere Wandler zu bevorzugen und Symmetrie mit den eingebauten Konvertern zu halten.

So würde ich eine InverseBooleanToVisibiltyConverter tun, die Boolesche Werte und gibt die Sichtbarkeit Typen akzeptiert. Dies entspricht dem integrierten BooleanToVisibilityConverter

Dann würde ich an die IsVisible-Eigenschaft der Schaltfläche nicht die Visibility-Eigenschaft binden.

Aber das ist eine Frage der Präferenz wirklich.

Verwandte Themen