依賴屬性 附加屬性通俗理解


依賴屬性以及附加屬性

依賴屬性(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屬性封裝器。這是因為附加屬性可以被用於任何對象。例如,GridRow屬性可能被用於Grid對象,也可能被用於其他元素上。

不使用.NET屬性封裝器,反而附加屬性需要調用兩個靜態方法來設置和獲取屬性值,這兩個方法使用為人熟知的SetValue()GetValue()方法,這兩個方法應當命名為SetPropertyName()和GetPropertyName()。

附加屬性與依賴屬性的區別

1.附加屬性使用的RegisterAttached方法,而依賴屬性使用的是Register方法

2.附加屬性使用兩個方法進行包裝,依賴屬性使用CLR屬性對GetValue和Set Value兩個方法進行包裝。

3.附加屬性被應用到的類並非定義附加屬性的那個類,依賴屬性被應用到定義附加屬性的那個類。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM