2008-12-21 38 views
7

He visto en Internet bastantes ejemplos de vincular un valor booleano a la propiedad Visibilidad de un control en XAML. La mayoría de los buenos ejemplos usan un convertidor BooleanToVisibiliy.Vinculación Visibilidad en XAML a una propiedad de Visibilidad

Me gustaría establecer la propiedad Visible en el control para enlazar a una propiedad System.Windows.Visibility en el código subyacente, pero parece que no quiere funcionar.

Ésta es mi XAML:

<Grid x:Name="actions" Visibility="{Binding Path=ActionsVisible, UpdateSourceTrigger=PropertyChanged}" /> 

Este es el código de la propiedad:

private Visibility _actionsVisible; 
public Visibility ActionsVisible 
{ 
    get 
    { 
     return _actionsVisible; 
    } 
    set 
    { 
     _actionsVisible = value; 
    } 
} 

En el constructor de la ventana, también tengo esta llamada:

base.DataContext = this; 

Cuando actualizo ActionsVisible o this.actions.Visibility, el estado no se transfiere. ¿Alguna idea de lo que podría estar yendo mal?

+0

Usted tiene que acceder a todos los controles del hilo en el que fueron creados. Puede actualizar los controles desde otros subprocesos, pero debe ordenar la actualización a través del subproceso de interfaz de usuario con el Despachador de WPF. Este [artículo] (http://msdn.microsoft.com/en-us/magazine/cc163328.aspx) debería ayudar. –

Respuesta

7

Creo que el problema es que WPF no puede saber que su propiedad ActionsVisible ha cambiado desde que no lo notificó.

Su clase deberá implementar INotifyPropertyChanged, luego, en su método de conjunto para ActionsVisible, deberá activar el evento PropertyChanged con ActionsVisible como el nombre de la propiedad que ha cambiado.

Espero que esto ayude ...

+0

No estoy en contra de hacer eso, pero también tengo un TextBox vinculado a una propiedad de cadena en el código subyacente y que funciona sin el evento INotifyPropertyChanged. Pensé que estableciendo UpdateSourceTrigger en PropertyChanged no necesitaría usar INotifyPropertyChanged. – Jared

+0

¡No estoy seguro de cómo funciona eso entonces! ¿Quieres publicar más de tu código? La propiedad UpdateSourceTrigger solo controla cuándo se actualiza el origen (es decir, la propiedad a la que se está vinculando). No tendrá ningún efecto en su propiedad de visibilidad. –

+0

Gracias Craig. Debería haber sido más claro en mi comentario anterior. Quise decir que tengo una propiedad TextBox's Text vinculada a una propiedad de cadena en el código subyacente. Eso funciona y si aún quieres ver la fuente de eso, házmelo saber. – Jared

8

Cambiar la propiedad de ser una propiedad de dependencia. Esto manejará la actualización por ti.

 public Visibility ActionsVisible 
    { 
     get { return (Visibility)GetValue(ActionsVisibleProperty); } 
     set { SetValue(ActionsVisibleProperty, value); } 
    } 

    // Using a DependencyProperty as the backing store for ActionsVisible. This enables animation, styling, binding, etc... 
    public static readonly DependencyProperty ActionsVisibleProperty = 
     DependencyProperty.Register("ActionsVisible", typeof(Visibility), typeof(FooForm)); 
+0

Al ejecutar este código en un hilo que no sea el hilo que lo posee, existe una excepción. El conjunto que moví al enlace fue para permitir que los elementos de la interfaz de usuario se actualizaran desde múltiples hilos. No parece que esta solución funcione para mí si tiene que ejecutarse en un solo hilo. – Jared

1

Comentario: NotifyPropertyChanged("ActionsVisible")

Cuestiones relacionadas