附加屬性依賴屬性的一種特殊形式,常見的Grid.Row,Canvas.Left都是附加屬性。
附加屬性的簡單定義如上述代碼所示。可以看出和依賴屬性不同的地方在于沒有作為屬性包裝器的Setter和Getter,而多了兩個靜态函數GetXXX和SetXXX。并且注冊辨別符使用DependencyProperty.RegisterAttached而不是DependencyProperty.Register。
和依賴屬性不同的地方在于,依賴屬性是依賴對象本身的屬性,附加屬性是附加在其他對象身上的屬性,通俗來說就是在别的對象内插入自己的屬性。上面提到的Grid.Row,就是Grid将Row屬性附加到沒有Row屬性的其它類中,以便進行布局。
附加實行的使用方式和依賴屬性十分相似。
在XAML中使用附加屬性:
在C#代碼中使用附加屬性:
以上代碼為一個相對完整的自定義附加屬性,自定義附加屬性的步驟如下
使用 DependencyProperty.RegisterAttached注冊附加屬性辨別符,标示符的名稱必須是PropertyName+"Property",如這個例子中的"LeftProperty"。在PropertyMetadata中指定屬性預設值。
實作靜态的屬性通路器函數,名稱必須是GetPropertyName 和SetPropertyName,如例子中的public static double GetLeft(DependencyObject obj)和public static void SetLeft(DependencyObject obj, double value)。
如果需要監視屬性值變更,可以在PropertyMetadata中定義一個PropertyChangedCallback方法,一遍命名方式為OnPropertyNameChanged,如上述例子中的private static void OnLeftChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args)。
注意: 屬性通路器中不要有多餘的代碼,理由參考依賴屬性。
VisualStudio自帶附加屬性的代碼段是propa,生成代碼如下:
要生成上述例子的完整附加屬性代碼,可使用自定義的代碼段,快捷鍵是ap: