2010-11-04 9 views
20

Me gustaría que el Control A sea visible si el Control B está oculto, y viceversa. Ahora mismo tengo este convertidor:Encuadernación desactivada Visibilidad de otro elemento e inversión

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

Y esto XAML:

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

que trabaja. Me pregunto si hay una forma más directa en WPF/Silverlight para lograr esto. No me importa tener un convertidor, solo quiero asegurarme de que no haya una mejor manera de la que no tenga conocimiento.

Respuesta

6

En pocas palabras, no veo ningún problema con lo que estás haciendo.

Dicho esto, si tiene una propiedad en el modelo de vista al que se vincula el control A para controlar su visibilidad, vincularía el control B a la misma propiedad e invertiría la visibilidad mediante un convertidor separado. No estoy seguro si puedo expresar por qué, pero eso me parece más natural (al menos en lugar de cualquier contexto adicional sobre lo que estás haciendo).

+0

Hay más contexto :) Gracias por la respuesta. –

20

En este caso, podría hacerlo con activadores. Ejemplo con dos botones

<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

Gracias por la respuesta. El disparador de estilo me parece un poco más engorroso que el convertidor, pero es una cuestión de preferencia personal. –

+0

Estoy de acuerdo con usted. Solo pensé en publicar otra forma de hacerlo :) –

3

¿Qué haces está bien, pero que tienden a preferir los convertidores más generales y para mantener la simetría con el construido en convertidores.

Así que yo haría un InverseBooleanToVisibiltyConverter que acepta booleanos y devuelve tipos de visibilidad. Esto coincide con el construido en BoolenToVisibiltyConverter

Luego me gustaría enlazar a la propiedad IsVisible del botón, no a la propiedad Visibilidad.

Pero eso es realmente una cuestión de preferencia.

Cuestiones relacionadas