2009-04-29 21 views
7

Tenemos un objeto que se deriva de DependencyObject e implementa algunas DependencyProperties.Propiedades de dependencia personalizadas y enlace de TwoWay en WPF

Básicamente algo como esto:

class Context : DependencyObject { 
    public static readonly DependencyProperty NameProperty = 
    DependencyProperty.Register ("Name", typeof (string), typeof (Context), new PropertyMetadata ("")); 
    public string Name { 
     get { 
      return (string)this.GetValue (NameProperty); 
     } 
     set { 
      this.SetValue (NameProperty, value); 
     } 
    } 
} 

Esto funciona, la propiedad es de configuración, se puede enlazar, etc. El problema viene cuando se unen al hotel fenomenal de WPF, usando un aprieto TwoWay. La parte de TwoWay nunca sucede realmente, WPF nunca llama al conjunto de esta propiedad. He puesto mi vinculante de esta manera:

<TextBox Text="{Binding Path=Name, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" /> 

En este caso, al escribir en el cuadro de texto debería actualizar de inmediato la propiedad Name, pero no es así. Si cambio la propiedad Name para que sea una propiedad POCO normal, funciona (aunque el otro lado de TwoWay obviamente no lo hace a menos que implemente INotifyPropertyChanged).

¿Qué estoy haciendo mal aquí? Esto debería ser algo muy simple de hacer, pero me está causando innumerables dolores de cabeza.

Respuesta

11

Se espera que esto suceda. La propiedad CLR es simplemente una envoltura alrededor del DependencyProperty subyacente. WPF a menudo optimiza llamando al GetValue y SetValue directamente. Si necesita una lógica personalizada para ejecutar, utilice los metadatos del DependencyProperty.

+0

Caray, soy un idiota. Estás 100% correcto, el valor en sí mismo está configurado correctamente, pero nunca se llama al colocador, que es lo que me atraviesa. Gracias. –

2

Después de este problema me costó algo de tiempo:

Para aquellos de ustedes que tienen el mismo problema, pero - como yo - no ven la solución en la respuesta anterior:

Para apoyar la herencia de el DataContext, la clase personalizada (Contexto en este caso) se debe derivar de FrameworkElement en lugar de DependencyObject. Eso es todo.

Marc

Cuestiones relacionadas