¿Qué es una propiedad de dependencia?

Respuestas:

94

Las propiedades de dependencia son propiedades de clases que se derivan de DependencyObject, y son especiales porque, en lugar de simplemente usar un campo de respaldo para almacenar su valor, usan algunos métodos auxiliares en DependencyObject.

Lo mejor de ellos es que tienen toda la tubería para el enlace de datos incorporado. Si les une algo, se lo notificarán cuando cambien.

Matt Hamilton
fuente
36
Eso todavía me dice muy poco sobre lo que puede hacer una propiedad de dependencia o por qué existe. No menciona nada de su propiedad más valiosa, la resolución de valor en el árbol de elementos.
ProfK
hola @MattHamilton, gracias por tu respuesta, pero ¿qué quieres decir con "usan algunos métodos auxiliares en DependencyObject"?
BKSpurgeon
2
@BKSpurgeon DependencyObject tiene algunos métodos como "SetValue" y "GetValue" a los que llama para guardar / leer el valor de una propiedad de dependencia, en lugar de utilizar un campo de respaldo.
Matt Hamilton
91

La única explicación que encontré útil y bien escrita es esta: http://www.wpftutorial.net/dependencyproperties.html

Básicamente, las propiedades de dependencia difieren de las propiedades regulares en que no son solo establecedores / captadores para campos en la clase, sino que recuperan sus valores reales dinámicamente durante el tiempo de ejecución. El SetValue()método de DP es bastante sencillo y establece el valor local de la propiedad en el valor que le dio. Sin embargo, cuando intente GetValue()desde una DependencyProperty, primero buscará un valor local, si no hay ninguno presente (que es viable en DependencyProperties a diferencia de las propiedades regulares) continuará en el árbol lógico de la interfaz de usuario hasta que encuentre dicho valor. Si el marco ha alcanzado la parte superior del árbol sin encontrar ningún valor local, utilizará un valor predeterminado predefinido como el valor de la propiedad.

Este método permite que DependencyProperties consuma menos memoria que las propiedades normales, ya que solo los valores establecidos explícitamente por el usuario se almacenarán localmente.

Y, como se mencionó anteriormente, DependencyProperties también nos permite vincularlos en el código XAML y establecer desencadenantes en ellos, lo que en propiedades normales no está permitido.

Espero haber logrado aclarar algo de la vaguedad :)

Jonathan Perry
fuente
2
¿Y qué es una "propiedad adjunta"?
Paul-Sebastian Manole
12
Una propiedad adjunta es una propiedad que no pertenece al elemento actual que se declara, pero afecta a otro objeto. Por ejemplo: Grid.Row="1"en un Buttonestablecerá que esté en la fila # 2 en el padre Grid(debido al hecho de que las filas están basadas en cero) pero la Rowpropiedad de dependencia pertenece al Gridobjeto.
Jonathan Perry
2
Cuando dijiste DependencyProperties also allow us to bind to them in the XAML code and set triggers on them, which on regular properties is not allowed, ¿querías decir que tanto el enlace en XAML como el establecimiento de desencadenantes o simplemente establecer desencadenantes no está permitido? ¡Gracias por el seguimiento y por ayudar a aclarar las cosas!
Paul-Sebastian Manole
@ Paul-SebastianManole DataTriggers también funciona en propiedades regulares. Supongamos que tiene una Valuepropiedad (No DP) con valor 0 y desea que su vista haga algo cuando Valuecambie a 1. Podrá hacerlo usando DataTriggery configurando elBinding={Binding Path=Value, Value=1}
Jonathan Perry
36

http://techpunch.wordpress.com/2008/09/25/wpf-wf-what-is-a-dependency-property/ proporciona una buena explicación de las propiedades de dependencia tanto en el contexto de WF como de WPF.

Un experto:

Punto clave: se resuelve el valor de las propiedades de dependencia

El objetivo final de una propiedad de dependencia, como cualquier propiedad, es administrar el estado. Pero a diferencia de las propiedades .Net normales, el valor de la propiedad local no se almacena en una variable de instancia.

En cambio, las propiedades de dependencia se registran con el marco de propiedad de dependencia, y el valor de propiedad subyacente se resuelve, lo que significa que el valor está determinado por el marco de propiedad de dependencia en base a las reglas definidas por el registro de propiedad.

Ash M
fuente