Es gibt zwei Konzepte hier: Abhängigkeitseigenschaften und verbundenen Abhängigkeitseigenschaften. "Angehängte Eigenschaften" sind Abhängigkeitseigenschaften und unterstützen daher die Abhängigkeit property value inheritance.
Über grundlegende Abhängigkeitseigenschaften wäre eine sehr grobe Aussage, dass sie ihre Werte grundsätzlich von übergeordneten Elementen im wpf (logisch/visuell) Baum erben. Eine Abhängigkeitseigenschaft (angehängt oder nicht) erbt ihren Wert "abwärts", wenn ihre metadata mit der FrameworkPropertyMetadataOptions festgelegt ist. Inherit Flag, und in vielen Fällen ist dies so.
Befestigt Objekte sind Objekte, die auf jedem Objekt WPF eingestellt werden können (im Allgemeinen, mindestens a DependencyObject) über die DependencyObject.SetValue Methode. Der Zweck dieses Mechanismus besteht darin, andere Informationen, die von übergeordneten Objekten benötigt werden, an "andere Objekte" anzuhängen, nicht die untergeordneten Objekte selbst. Beispielsweise ist die Grid.Row eine angefügte Eigenschaft, die von dem Raster benötigt wird, um Elemente in seinem Wiedergabebereich zu platzieren.
Abhängigkeitseigenschaften werden vom wpf-Objektsystem automatisch "nach unten" vererbt.
Angehängte Eigenschaften werden explizit im Code bestimmter Objekte "nach oben" untersucht. Im Fall von Grid prüft es bei der Bestimmung, wo seine Elemente platziert werden sollen, nach dem Wert der angefügten Eigenschaften Grid.Row und Grid.Column für jedes enthaltene Element.
Es ist auch oft die Technik, um benutzerdefinierte angefügte Eigenschaften zu erstellen, die in irgendeiner Weise die Objekte ändern, denen sie zugeordnet sind (z. B. Drag'n'Drop functionality via attached properties).
Als eine zusätzliche Anmerkung ist ein gutes Beispiel für eine geerbte angefügte Eigenschaft TextElement.FontFamily. Grid.Row- und Grid.Column-Eigenschaften haben das Inherits-Flag nicht festgelegt.
TextElement.FontFamily, von Reflektor:
FontFamilyProperty = DependencyProperty.RegisterAttached("FontFamily", typeof(FontFamily), typeof(TextElement), new FrameworkPropertyMetadata(SystemFonts.MessageFontFamily, FrameworkPropertyMetadataOptions.Inherits | FrameworkPropertyMetadataOptions.AffectsRender | FrameworkPropertyMetadataOptions.AffectsMeasure), new ValidateValueCallback(TextElement.IsValidFontFamily));
Grid.Row, von Reflektor:
RowProperty = DependencyProperty.RegisterAttached("Row", typeof(int), typeof(Grid), new FrameworkPropertyMetadata(0, new PropertyChangedCallback(Grid.OnCellAttachedPropertyChanged)), new ValidateValueCallback(Grid.IsIntValueNotNegative));
Interessant und informativ. Was aber ist mit diesem Szenario: Ein 2x2 Grid (A) enthält ein 2x2 Grid (B). Grid B enthält einen Button. Wenn Grid B sein Grid hat.Column Attached Property auf 1 gesetzt (so erscheint es in der zweiten Spalte des übergeordneten Rasters, Grid A), sollte diese Attached-Eigenschaft nicht nach unten auf den Button von Grid B kaskadieren, sodass der Button in der zweiten Spalte von Grid B erscheint? – Pwninstein
Gute Frage, fügte Informationen zu der Antwort hinzu. –
Super! Macht jetzt viel mehr Sinn, danke !! – Pwninstein