2010-11-04 9 views
20

Vorrei rendere visibile A Controllo se Controllo B è nascosto e viceversa. In questo momento ho questo convertitore:Rilegatura Visibilità di un altro elemento - e inversione

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

E questo XAML:

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

Quali opere. Mi sto solo chiedendo se c'è un modo più diretto in WPF/Silverlight per realizzare questo? Non mi interessa avere un convertitore, voglio solo assicurarmi che non ci sia un modo migliore di cui non sono a conoscenza.

risposta

6

In conclusione, non vedo alcun problema con quello che stai facendo.

Detto questo, se si dispone di una proprietà nel ViewModel a cui Control A si lega per controllarne la visibilità, legherei Control B alla stessa proprietà e invertire visivamente con un convertitore separato. Non sono sicuro di poter articolare il motivo, ma mi sembra più naturale (almeno in sostituzione di qualsiasi contesto aggiuntivo intorno a ciò che stai facendo).

+0

C'è più contesto :) Grazie per la risposta. –

20

In questo caso, è possibile farlo con i trigger. Esempio con due pulsanti

<Button Name="button1"> 
    <Button.Style> 
     <Style> 
      <Style.Triggers> 
       <DataTrigger Binding="{Binding ElementName=button2, Path=Visibility}" Value="Visible"> 
        <Setter Property="Button.Visibility" Value="Hidden"/> 
       </DataTrigger> 
      </Style.Triggers> 
     </Style> 
    </Button.Style> 
</Button> 
<Button Name="button2"/> 
+1

Grazie per la risposta. Il trigger di stile mi sembra un po 'più ingombrante del convertitore, ma è una questione di preferenze personali. –

+0

Sono d'accordo con te. Ho pensato di pubblicare un altro modo per farlo :) –

3

Che cosa stai facendo va bene, ma io tendo a preferire convertitori più generali e per mantenere la simmetria con il costruito nel convertitori.

Quindi dovrei fare un InverseBooleanToVisibiltyConverter che accetta i booleani e restituisce i tipi di visibilità. Ciò corrisponde al built-in BoolenToVisibiltyConverter

Quindi collegherei alla proprietà IsVisible del pulsante non alla proprietà Visibility.

Ma è davvero una questione di preferenze.

Problemi correlati