My friends, my life, my style - James S.F. Hsieh

4/20/2009

Dependency Property of WPF

Dependency Property 是個有趣的設計, 他提供一種低耦合性的屬性依附機制, 允許任何人定義特定的屬性 (AnyClass) 並且將其屬性注入繼承至 DependencyObject 的任何類別 (ChildClass). 重點在於: ChildClass 不需要對該屬性有任何的概念與反應, 只有了解所定義屬性的 AnyClass 才需要(才能夠) 處理該屬性並且給予是當的反應.

這種概念跟 Web 2.0 貼標籤 tag 有著相同的想法. 被貼標籤的文章或照片不能夠了解標籤的意義, 因為這個標籤只對貼標籤的人才有意義.

相同的 Class 的兩個物件可以有著不同的相依屬性 (tag), 所以, 對了解該屬性的其他物件與這兩個物件互動時, 可以有著完全不同的反應, 而這種多型性是定義在外在的相依屬性, 原本的 Class 只要繼承至 DependencyObject 就有能力被 attach 任何的 Dependency Property, 而且, 當屬性改變時, 還可以觸發相對應的通告來產生對應的自訂行為.


以下程式碼, ChildClass 跟 AnyClass 為相同的 Class 做為例子
public class ChildClass : DependencyObject
{
public ChildClass () :
base() { }
public Boolean State
{
get { return
(Boolean)this.GetValue(StateProperty); }
set { this.SetValue(StateProperty, value); }
}
public
static readonly DependencyProperty
StateProperty =
DependencyProperty.Register("State", typeof(Boolean),
typeof(ChildClass),new
PropertyMetadata(false));
}
WPF 利用這個機制來處理 XAML 中所有的屬性, 這些可以達成 XAML 與 Visual Tree 物件間的屬性巢狀繼承, 屬性改變通告, 等多種應用, 對於 WPF 的設計理念 Code + Markup 極為重要.