這裏有兩個概念:依賴項屬性和附加依賴項屬性。 「附加屬性」是依賴屬性,支持依賴關係property value inheritance。
關於基本依賴屬性,一個非常粗略的說法是,它們基本上是從wpf(邏輯/視覺)樹中的父元素繼承它們的值。如果它的metadata設置爲FrameworkPropertyMetadataOptions,則依賴項屬性(附加或不附加)將繼承其值「向下」。 繼承標誌,並且在很多情況下都是如此。
附加屬性是可以通過DependencyObject.SetValue方法在任何wpf對象上設置的屬性(基本上,至少爲 DependencyObject)。此機制的目的是「附加」到父對象所需的其他對象信息,而不是子對象本身。例如,Grid.Row是網格所需的附加屬性,用於將項目放置在其渲染區域中。
相關屬性由wpf對象系統自動「向下」繼承。
附加屬性在特定對象的代碼中顯式檢查「向上」。在網格的情況下,在確定將物品放置在何處時,它會檢查每個包含物品的Grid.Row和Grid.Column附加屬性的值。
它也常常是創建自定義附加屬性的技術,它以某種方式修改它們所連接的對象(例如,Drag'n'Drop functionality via attached properties)。
作爲附加說明,繼承附加屬性的一個很好的示例是TextElement.FontFamily。 Grid.Row和Grid.Column屬性沒有設置Inherits標誌。
TextElement.FontFamily,從反射器:
FontFamilyProperty = DependencyProperty.RegisterAttached("FontFamily", typeof(FontFamily), typeof(TextElement), new FrameworkPropertyMetadata(SystemFonts.MessageFontFamily, FrameworkPropertyMetadataOptions.Inherits | FrameworkPropertyMetadataOptions.AffectsRender | FrameworkPropertyMetadataOptions.AffectsMeasure), new ValidateValueCallback(TextElement.IsValidFontFamily));
Grid.Row,從反射器:
RowProperty = DependencyProperty.RegisterAttached("Row", typeof(int), typeof(Grid), new FrameworkPropertyMetadata(0, new PropertyChangedCallback(Grid.OnCellAttachedPropertyChanged)), new ValidateValueCallback(Grid.IsIntValueNotNegative));
有趣且信息豐富。但是,這種情況如何:2x2網格(A)包含2x2網格(B)。網格B包含一個按鈕。如果網格B具有網格。列附加屬性設置爲1(因此它出現在其父網格的第二列中,網格A),不應該將附加屬性向下級聯到網格B的按鈕,因此按鈕會出現在網格B的第二列? – Pwninstein 2009-07-23 23:01:23