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));
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
Buena pregunta, información adicional a la respuesta. –
¡Impresionante! Ahora tiene mucho más sentido, ¡gracias! – Pwninstein