2009-07-23 11 views
21

estoy un poco desconcertado en cuanto a cómo las propiedades asociadas en realidad transmiten sus valores a cualquiera de los elementos secundarios padre o. TextElement.FontFamily hace que los elementos secundarios hereden el valor asignado a esa propiedad (una operación aparentemente descendente, de padre a hijo). Grid.Column hace que un elemento principal muestre a ese elemento secundario en una posición particular (una operación aparentemente ascendente, de niño a principal). ¿Cómo saben los valores de propiedades adjuntas fluir hacia arriba o hacia abajo? ¿Es incorrecta mi concepción de esto o falta alguna pieza que ponga todo esto en perspectiva?¿Cómo funcionan exactamente las propiedades adjuntas en WPF?

<StackPanel TextElement.FontFamily="Wingdings"> 
    <Grid> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="*"/> 
      <ColumnDefinition Width="*"/> 
     </Grid.ColumnDefinitions> 

     <Button Grid.Column="1" Content="My Button"/> 
    </Grid> 
</StackPanel> 

Respuesta

38

Hay dos conceptos aquí: propiedades de dependencia y adjuntos propiedades de dependencia. Las "Propiedades adjuntas" son propiedades de dependencia y, como tal, admiten la dependencia property value inheritance.

Acerca de las propiedades básicas de dependencia, una afirmación muy aproximada sería que básicamente heredan sus valores de los elementos principales en el árbol wpf (lógico/visual). Una propiedad de dependencia (asociada o no) hereda su valor "hacia abajo" si su metadata se establece con el FrameworkPropertyMetadataOptions. Heredar marca, y en muchos casos esto es así.

propiedades adjuntas son propiedades que se pueden ajustar en cualquier objeto wpf (básicamente, al menos un DependencyObject) a través del método DependencyObject.SetValue. El propósito de este mecanismo es "adjuntar" a otros objetos la información que necesitan los objetos principales, no los objetos propios. Por ejemplo, el Grid.Row es una propiedad adjunta requerida por la cuadrícula para colocar elementos dentro de su área de representación.

Las propiedades de dependencia se heredan "hacia abajo" automáticamente por el sistema de objetos wpf.

Las propiedades adjuntas se examinan "hacia arriba" explícitamente, en el código de objetos específicos. En el caso de Grid, al determinar dónde colocar sus artículos, verifica el valor de las propiedades adjuntas de Grid.Row y Grid.Column en cada elemento contenido.

También es a menudo la técnica para crear propiedades adjuntas costumbre que modifican de alguna manera los objetos que están unidos (por ejemplo, el Drag'n'Drop functionality via attached properties).

Como nota adicional, un buen ejemplo de heredar propiedad adjunta es TextElement.FontFamily. Las propiedades Grid.Row y Grid.Column no tienen establecido el indicador Heredades.

TextElement.FontFamily, a partir del reflector:

FontFamilyProperty = DependencyProperty.RegisterAttached("FontFamily", typeof(FontFamily), typeof(TextElement), new FrameworkPropertyMetadata(SystemFonts.MessageFontFamily, FrameworkPropertyMetadataOptions.Inherits | FrameworkPropertyMetadataOptions.AffectsRender | FrameworkPropertyMetadataOptions.AffectsMeasure), new ValidateValueCallback(TextElement.IsValidFontFamily)); 

Grid.Row, a partir del reflector:

RowProperty = DependencyProperty.RegisterAttached("Row", typeof(int), typeof(Grid), new FrameworkPropertyMetadata(0, new PropertyChangedCallback(Grid.OnCellAttachedPropertyChanged)), new ValidateValueCallback(Grid.IsIntValueNotNegative)); 
+1

Interesante e informativo. Sin embargo, qué pasa con este escenario: una cuadrícula de 2x2 (A) contiene una cuadrícula de 2x2 (B). La rejilla B contiene un botón. Si la cuadrícula B tiene su cuadrícula.Column Attached Property establecido en 1 (para que aparezca en la segunda columna de su cuadrícula principal, Grilla A), ¿no debería esa Propiedad adjunta caer en cascada hacia el Botón de la Grilla B, entonces el Botón aparece en la segunda columna de la Grilla B? – Pwninstein

+1

Buena pregunta, información adicional a la respuesta. –

+0

¡Impresionante! Ahora tiene mucho más sentido, ¡gracias! – Pwninstein

2

De MSDN:

Aunque las propiedades adjuntas se pueden configurar en cualquier objeto, eso no significa automáticamente que establecer la propiedad producirá un resultado tangible, o que el valor nunca será utilizado por otro objeto. En general, las propiedades adjuntas están pensadas para que los objetos procedentes de una amplia variedad de posibles jerarquías de clases o relaciones lógicas puedan informar información común al tipo que define la propiedad adjunta. El tipo que define la propiedad adjunta típicamente sigue uno de estos modelos:

  • El tipo que define el propiedad adjunta está diseñado de modo que pueda ser el elemento padre de los elementos que fijarán valores para el propiedad adjunta . El tipo entonces itera sus objetos secundarios través de la lógica interna contra alguna estructura árbol de objetos, obtiene los valores, y actúa sobre esos valores de alguna manera.

  • El tipo que define el propiedad adjunta se utilizará como el elemento hijo para una variedad de posibles elementos matrices y modelos de contenido.

  • El tipo que define el propiedad adjunta representa un servicio. Otros tipos establecen valores para la propiedad adjunta. Entonces, cuando el elemento que establezca la propiedad es evaluada en el contexto del servicio , los valores de propiedad adjuntos se obtienen a través lógica interna de la clase de servicio.

Un ejemplo de un padre-Defined anexa Propiedad

El escenario más típico en el que WPF define una propiedad adjunta es cuando un elemento padre soporta una colección elemento hijo, y también implementa un comportamiento en el que el los detalles del comportamiento se informan individualmente para cada elemento secundario.

DockPanel define la propiedad adjunta DockPanel.Dock, y DockPanel tiene un código de nivel de clase como parte de su lógica de representación (específicamente, MeasureOverride y ArrangeOverride). Una instancia de DockPanel siempre verificará si alguno de sus elementos secundarios inmediatos ha establecido un valor para DockPanel.Dock. Si es así, esos valores se convierten en entrada para la lógica de representación aplicada a ese elemento hijo en particular. Cada instancia de DockPanel anidado trata sus propias colecciones de elementos secundarios inmediatos, pero ese comportamiento es específico de la implementación de cómo DockPanel procesa los valores de DockPanel.Dock. Teóricamente es posible tener propiedades adjuntas que influyan en elementos más allá del padre inmediato. Si el DockPanel.La propiedad adjunta Dock se establece en un elemento que no tiene un elemento padre DockPanel para actuar sobre él, no se genera ningún error o excepción. Esto simplemente significa que se estableció un valor de propiedad global, pero no tiene un elemento primario DockPanel actual que pueda consumir la información.

0

En palabras simples, esto es como yo lo entiendo (por favor, corríjanme si me equivoco)

Un objeto (A) implementa una propiedad que se adjuntará a otro objeto (B) (el objeto B ni siquiera sabe acerca de la existencia de esta propiedad "conectable"). El Objeto B necesita heredar de DependencyObject.

El Objeto A también implementa un método estático para comprobar su propiedad "conectable" en otros objetos, A.GetAttachedProperty (B).

Si B tiene la propiedad adjunta de A, A.GetAttachedProperty leerá y devolverá su valor. De lo contrario, A intentará leerlo y devolverá nulo, ya que no está allí.

Cuestiones relacionadas