依賴屬性 附加屬性通俗理解
依賴屬性以及附加屬性
依賴屬性(DependencyProperty)
1.概念
依賴屬性是一種可以自己沒有值,並能通過使用Binding從資料來源獲得值的屬性(通俗的講,就是依賴在別的屬性上)。
依賴屬性是為了解決普通屬性因繼承而帶來的物件膨脹。
例如Button的繼承
Button->ButtonBase->ContentControl->Control->FrameworkElement->UIElement->Visual->DependencyObject->...
所以每次繼承,父類的私有欄位都會被繼承下來。繼承樹的低端物件不可避免的膨脹。大多數屬性並沒有被修改,仍然保持著父類定義時的預設值。
定義依賴屬性
例:
// 定義依賴屬性
public static readonly DependencyProperty NameProperty;
註冊依賴屬性
必須在於其關聯的靜態建構函式中註冊
新增屬性封裝器
public string Title
{
get { return (string)GetValue(NameProperty); }
set { SetValue(NameProperty, value); }
}
建立屬性封裝器時,應當只包含對SetValue()和GetValue()方法的呼叫,不應當新增任何驗證屬性值的額外程式碼、引發事件的程式碼等。這是因為WPF中的其他功能可能會忽略屬性封裝器,並直接呼叫SetValue()和GetValue()方法。
屬性封裝器不是驗證資料或引發事件的正確位置,使用依賴屬性回撥函式(Dependency-Property.Validate ValueCallback回撥函式進行驗證操作)
當屬性變化時,如果希望進行響應,有兩種選擇--可以使用屬性值建立繫結,也可以編寫能夠自動改變其他屬性或開始動畫的觸發器。
依賴屬性的優點:
① 優化了屬性的儲存,減少了不必要的記憶體使用
② 加入了屬性變化通知,限制,驗證等
③ 可以儲存多個值,配合人EXpression以及Animation等,打造出更靈活的使用方式
eg:
1 public partial class MainWindow : Window 2 { 3 public MainWindow() 4 { 5 InitializeComponent(); 6 TestTitle testTitle = new TestTitle { Title = "TestData" }; 7 this.stkpnlTest.DataContext = testTitle; 8 } 9 10 public class TestTitle : DependencyObject 11 { 12 public string Title 13 { 14 get { return (string)GetValue(NameProperty); } 15 set { SetValue(NameProperty, value); } 16 } 17 // 定義依賴屬性 18 public static readonly DependencyProperty NameProperty = 19 DependencyProperty.Register("Title", typeof(string), typeof(TestTitle)); 20 } 21 }
xaml:
1 <StackPanel x:Name="stkpnlTest"> 2 <TextBox x:Name="txtTest1" 3 Margin="10" 4 Text="{Binding Path=Title}"></TextBox> 5 <TextBox x:Name="txtTest2" 6 Margin="10" 7 Text="{Binding Path=Title}"></TextBox> 8 </StackPanel>
附加屬性
1.概念
附加屬性是一種依賴屬性,不同之處在於附加屬性被應用到的類並非定義附加屬性的那個類。
定義附加屬性
定義附加屬性,需要使用RegisterAttached()方法,而不是使用Register()方法
當建立附加屬性時,不必定義.NET屬性封裝器。這是因為附加屬性可以被用於任何物件。例如,Grid。Row屬性可能被用於Grid物件,也可能被用於其他元素上。
不使用.NET屬性封裝器,反而附加屬性需要呼叫兩個靜態方法來設定和獲取屬性值,這兩個方法使用為人熟知的SetValue()和GetValue()方法,這兩個方法應當命名為SetPropertyName()和GetPropertyName()。
附加屬性與依賴屬性的區別
1.附加屬性使用的RegisterAttached方法,而依賴屬性使用的是Register方法
2.附加屬性使用兩個方法進行包裝,依賴屬性使用CLR屬性對GetValue和Set Value兩個方法進行包裝。
3.附加屬性被應用到的類並非定義附加屬性的那個類,依賴屬性被應用到定義附加屬性的那個類。