Herencia de valores de propiedad

La herencia de valores de propiedad es una característica del sistema de propiedades de Windows Presentation Foundation (WPF). La herencia de valores de propiedad permite que los elementos secundarios de un árbol de elementos obtengan el valor de una propiedad determinada de los elementos principales y que hereden ese valor tal como se estableció en cualquier otro lugar del elemento principal más cercano. Es posible que el elemento principal también haya obtenido su valor a través de la herencia de valores de propiedad, por lo que el sistema se repite potencialmente hasta la raíz de la página. La herencia de valores de propiedad no es el comportamiento del sistema de propiedades predeterminado: es necesario establecer una propiedad con un valor de metadatos concreto para que inicie la herencia de valores de propiedad en elementos secundarios.

La herencia de valores de propiedad es la herencia de contención

"Herencia" como término aquí no es exactamente el mismo concepto que la herencia en el contexto de programación orientada a objetos generales y tipos, donde las clases derivadas heredan las definiciones de miembros de sus clases base. Ese significado de herencia también está activo en WPF: las propiedades definidas en varias clases base se exponen como atributos para clases XAML derivadas cuando se usan como elementos y se exponen como miembros para el código. La herencia de valores de propiedad trata especialmente acerca de cómo los valores de propiedad se pueden heredar de un elemento a otro basándose en las relaciones entre elementos primarios y secundarios de un árbol de elementos. Ese árbol de elementos es visible directamente al anidar unos elementos dentro de otros cuando se definen aplicaciones en marcado XAML. Los árboles de objetos también pueden crearse mediante programación si se agregan objetos a colecciones designadas de otros objetos. La herencia de valores de propiedad funciona del mismo modo en el árbol terminado en tiempo de ejecución.

Aplicaciones prácticas de la herencia de valores de propiedad

Las API de WPF incluyen varias propiedades que tienen habilitada la herencia de propiedades. Normalmente, el escenario en estos casos es que implican una propiedad donde es apropiado que se establezca la propiedad una sola vez por página, pero donde esa propiedad también es un miembro de una de las clases de elementos base y, por tanto, también existirá en la mayoría de los elementos secundarios. Por ejemplo, la propiedad FlowDirection controla la dirección en la que se debe presentar y organizar el contenido del flujo en la página. Normalmente, quiere que el concepto de flujo de texto se controle de forma coherente en todos los elementos secundarios. Si el usuario o una acción del entorno restableciera la dirección de flujo por alguna razón en algún nivel del árbol de elementos, normalmente, debería restablecerse en todo el árbol. Cuando se hace que la propiedad FlowDirection se pueda heredar, el valor solo se debe establecer o restablecer una vez en el nivel del árbol de elementos que abarca las necesidades de presentación de cada página de la aplicación. Incluso el valor predeterminado inicial se heredará de esta manera. El modelo de herencia de valor de propiedad aún permite que elementos individuales restablezcan el valor para los pocos casos en los que tener una combinación de direcciones de flujo es deliberado.

Hacer heredable una propiedad personalizada

Al cambiar los metadatos de una propiedad personalizada, también puede hacer que sus propias propiedades personalizadas sean heredables. Sin embargo, tenga en cuenta que designar una propiedad como heredable tiene algunas consideraciones de rendimiento. En casos donde esa propiedad no tiene ningún valor local establecido o ningún valor obtenido a través de estilos, plantillas o enlaces de datos, una propiedad heredable proporciona sus valores de propiedad asignados a todos los elementos secundarios del árbol lógico.

Para que una propiedad participe en la herencia de valores, cree una propiedad asociada personalizada, tal como se describe en Registrar una propiedad asociada. Registre la propiedad con metadatos (FrameworkPropertyMetadata) y especifique la opción "Hereda" en la configuración de opciones dentro de los metadatos. Asegúrese también de que la propiedad tenga un valor predeterminado establecido, porque ahora se heredará ese valor. Aunque registró la propiedad como asociada, es posible que también quiera crear una propiedad "wrapper" para obtener o establecer acceso al tipo de propietario, del mismo modo que para una propiedad de dependencia "nonattached". Después de hacerlo, la propiedad heredable se puede establecer mediante el contenedor de propiedad directa en el tipo de propietario o los tipos derivados, o bien se puede establecer mediante la sintaxis de propiedad asociada en cualquier objeto DependencyObject.

Las propiedades asociadas son conceptualmente similares a las propiedades globales: puede comprobar el valor en cualquier objeto DependencyObject y obtener un resultado válido. El escenario típico para las propiedades asociadas consiste en establecer valores de propiedad en elementos secundarios, y ese escenario es más eficaz si la propiedad en cuestión es una propiedad asociada que siempre está presente implícitamente como una propiedad asociada en cada elemento (DependencyObject) del árbol.

Nota:

Aunque puede parecer que la herencia de valores de propiedad funciona para las propiedades de dependencia que no son asociadas, el comportamiento de la herencia para una propiedad no asociada a través de algunos límites de elementos en el árbol de tiempo de ejecución es indefinido. Use siempre RegisterAttached para registrar las propiedades donde especifique Inherits en los metadatos.

Heredar valores de propiedad entre límites de árbol

La herencia de propiedades funciona al recorrer un árbol de elementos. Este árbol suele ser paralelo al árbol lógico. Pero siempre que incluya un objeto de nivel básico de WPF, en el marcado que define un árbol de elementos, como un objeto Brush, habrá creado un árbol lógico discontinuo. Un verdadero árbol lógico no se extiende conceptualmente mediante Brush, ya que el árbol lógico es un concepto de nivel de marco de WPF. Puede verlo reflejado en los resultados al usar los métodos de LogicalTreeHelper. Pero la herencia de valor de propiedades puede cerrar esta brecha en el árbol lógico y todavía puede pasar valores heredados, siempre y cuando la propiedad heredable se haya registrado como una propiedad asociada y no se encuentre ningún límite de bloqueo de herencia deliberado (como Frame).

Vea también