Saltar al contenido

¿Cuál es el mecanismo del marco detrás de las propiedades de dependencia?

Bienvenido a proyecto online, en este lugar vas a hallar la solucíon que buscas.

Solución:

Mi modelo mental de cómo funcionan las propiedades de dependencia:

Ninguna DependencyObject La clase implementa dos propiedades especiales. uno, un static propiedad de la clase, es un diccionario de DependencyProperty objetos. Cada instancia de la clase puede buscar dentro de ese diccionario para encontrar metainformación sobre cada DependencyProperty – el nombre de la propiedad, su tipo, las devoluciones de llamada que deben llamarse cuando se obtiene y establece, cómo participa en la herencia de la propiedad, etc. Cuando registra una propiedad de dependencia, está agregando una entrada a este diccionario.

La otra propiedad es una propiedad de instancia: es un diccionario, codificado por DependencyPropertyque contiene el local valor de cada DependencyPropertysi se ha configurado.

Él SetValue y GetValue Los métodos que implementa en el setter y getter de la propiedad CLR son básicamente una evaluación perezosa con esteroides. En lugar de almacenar y recuperar el valor de la propiedad en un campo de respaldo, almacenan y recuperan el valor de la propiedad en el diccionario de valores.

La magia de las propiedades de dependencia está en lo que GetValue y SetValue en realidad hacer

GetValue busca el valor de la propiedad en el diccionario de valores del objeto. Si no lo encuentra, llama GetValue en el elemento principal, para obtener lo que el elemento principal cree que es el valor. Por ejemplo, cuando creas un TextBox en un Windowcualquier cosa que mire al TextBox‘s FontFamily en realidad está llamando GetValue. A menos que haya establecido explícitamente la fuente, no hay ninguna entrada en su diccionario para esa propiedad. Asi que GetValue pregunta al elemento padre por el valor. El elemento principal puede o no tener FontFamily colocar; que no, su llamar a GetValue para devolver el valor de su padre. Y así sucesivamente, hasta que el Window se alcanza el objeto y el real FontFamily se encuentra el valor.

si configuras FontFamily sobre el TextBox, SetValue almacena el valor en el diccionario de valores. La próxima vez que algo necesite obtener el valor de la FontFamily para eso TextBox, GetValue encuentra el valor en el diccionario y lo devuelve, por lo que no necesita preguntar al elemento principal.

si configuras FontFamily sobre el Window, SetValue no solo actualiza el valor en Windowdel diccionario de valores, activa un evento de cambio de propiedad que escucha todo lo que depende de la propiedad. (Es por eso que se llaman propiedades de dependencia, recuerde). Y si la cosa que depende de la propiedad es en sí misma una propiedad de dependencia, activa sus propios eventos de cambio de propiedad. Así es como es que cambiando el FontFamily sobre el Window cambia la fuente de cada control en la ventana y también solicita a WPF que vuelva a representar los controles que han cambiado.

Las propiedades adjuntas funcionan con el mismo tipo de enfoque. Cualquier objeto que pueda tener propiedades adjuntas tiene un diccionario en el que se almacenan los valores de las propiedades adjuntas. Grid.Column en un CheckBox en XAML, solo estás agregando una entrada a eso CheckBoxdiccionario de . Cuando el Grid necesita saber en qué columna CheckBox está adentro, busca el valor de ese diccionario. cuando configuras Grid.IsSharedSizeScope para True en un objeto, el diccionario de ese objeto contendrá una nueva propiedad: un diccionario que contiene anchos/altos para cada SharedSizeKey.

Debo enfatizar que este es mi modelo mental. No me he sentado con Reflector y mirado el actual implementación de Register, GetValuey SetValue para averiguar cómo funcionan realmente. Puedo estar equivocado acerca de los detalles. Pero es un modelo que predice con precisión cómo se comportan estas cosas, por lo que es lo suficientemente bueno.

El concepto de almacenar valores de propiedad en diccionarios es bastante extraño para los programadores de C#. Sin embargo, es un sombrero viejo para los programadores de Python. En Python, todas las propiedades de clase (de hecho, todos los objetos) se almacenan en diccionarios, por lo que puede obtener su valor a través de accesos de propiedad o simplemente buscándolos. Las propiedades de dependencia y las propiedades adjuntas son solo otra forma en que .NET, después de haber robado todo lo que tenía Java que valía la pena robar, ahora está saqueando a Python. (O de donde sea que Python los haya saqueado). Aprender Python me ha convertido en un mejor programador de C#; Se lo recomiendo a cualquier desarrollador de C# que aún no lo haya hecho.

Aquí hay un tutorial sobre las propiedades de dependencia http://www.wpftutorial.net/DependencyProperties.html que explica un poco cómo funcionan.

La breve explicación de por qué el objeto DependencyProperty está en un static campo es que representa el descripción de la propiedad, no el valor de la propiedad. Cada DependencyObject tiene una asignación de los objetos DependencyProperty a sus valores.

Así es también como funcionan las propiedades adjuntas. Debido a que cada DependencyObject almacena una asignación de cualquier DependencyProperty a un valor, cualquier tipo puede crear una nueva DependencyProperty y establecerla en cualquier DependencyObject existente.

solo vea esta publicación de joshsmith, tiene información adicional

Overview of dependency properties in WPF

Aquí puedes ver las reseñas y valoraciones de los lectores

Puedes corroborar nuestro estudio mostrando un comentario y valorándolo te damos la bienvenida.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *