2010-11-19 10 views
34

Solo una breve pregunta para aclarar algunas dudas. ¿Los setters no se ejecutan cuando un elemento está vinculado a una propiedad de dependencia?Setters no se ejecutan en Propiedades de dependencia?

public string TextContent 
{ 
    get { return (string)GetValue(TextContentProperty); } 
    set { SetValue(TextContentProperty, value); Debug.WriteLine("Setting value of TextContent: " + value); } 
} 

public static readonly DependencyProperty TextContentProperty = 
    DependencyProperty.Register("TextContent", typeof(string), typeof(MarkdownEditor), new UIPropertyMetadata("")); 

...

<TextBox Text="{Binding TextContent}" /> 

Como he notado el siguiente en mi organismo no funciona

Debug.WriteLine("Setting value of TextContent: " + value); 
+0

si se pone un punto de interrupción en la incubadora se puede ver donde se consigue el sistema. – VoodooChild

+4

Si necesita ejecutar el código cuando se establece la propiedad, mire CoerceValueCallback o ValueChangedCallback de la clase UIMetadata. – Jens

+0

posible duplicado de [WPF: las declaraciones de propiedad XAML no se establecen a través de Setters?] (Http://stackoverflow.com/questions/3836076/wpf-xaml-property-declarations-not-being-set-via-setters) –

Respuesta

46

El motor de enlace WPF llama GetValue y SetValue directamente (sin pasar por los emisores de propiedad y getters). Necesita la propiedad para estar allí para que pueda ser compatible con el marcado XAML (y compilar correctamente).

+0

Hola , No estoy seguro de entender lo que dices? – Emixam23

+0

@ Emixam23 Dean está diciendo que el OP no puede poner una declaración de depuración en la propiedad TextContent para determinar si el DP está o no correctamente enlazado, porque WPF llamará a SetValue, no al ajustador TextContent. – Dave

34

Para crear una DependencyProperty, agregue un campo estático de tipo DepdencyProperty a su tipo y llame a DependencyProperty.Register() para crear una instancia de una propiedad de dependencia. El nombre de DependendyProperty siempre debe terminar con ... Propiedad. Esta es una convención de nombres en WPF.

Para que sea accesible como una propiedad .NET normal, debe agregar un contenedor de propiedades. Este contenedor no hace nada más que obtener internamente y establecer el valor utilizando los métodos GetValue() y SetValue() heredados de DependencyObject y pasando DependencyProperty como clave.

No agregue ninguna lógica a estas propiedades, ya que solo se llaman cuando establece la propiedad del código. Si configura la propiedad desde XAML, se llama directamente al método SetValue().

Cada DependencyProperty proporciona devoluciones de llamada para notificación de cambio, coerción de valor y validación. Estas devoluciones de llamada están registradas en la propiedad de dependencia.

fuente: http://www.wpftutorial.net/DependencyProperties.html

+0

¡me has salvado la vida! – j00hi

Cuestiones relacionadas