1. 程式人生 > 其它 >WPF依賴屬性-依賴屬性介紹

WPF依賴屬性-依賴屬性介紹

WPF的設計理念是:資料驅動,UI與邏輯鬆耦合

一、傳統的CLR屬性
public class Person
{
    private string _Name;
    public string Name
    {
        get
        {
             return _Name;
         }
         set
         {
            _Name = value;
         }
     }
 }
二、CLR屬性特點:
  • CLR屬性,是例項屬性;
  • 在多級繼承的情況下,孫孫輩物件佔用記憶體空間不可避免的膨脹;
三、依賴屬性
// 1. 使型別繼承DependencyObject類
    public class Person : DependencyObject
    {
        // 2. 宣告一個靜態只讀的DependencyProperty 欄位
        public static readonly DependencyProperty nameProperty;
        static Person()
        {
            // 3. 註冊定義的依賴屬性
            nameProperty = DependencyProperty.Register("Name", typeof(string), typeof(Person), 
                new PropertyMetadata("Learning Hard",OnValueChanged)); 
        }
        // 4. 屬性包裝器,通過它來讀取和設定我們剛才註冊的依賴屬性
        public string Name
        {
            get { return (string)GetValue(nameProperty); }
            set { SetValue(nameProperty, value); }
        }
        private static void OnValueChanged(DependencyObject dpobj, DependencyPropertyChangedEventArgs e)
        {
            // 當只發生改變時回撥的方法
        }
    }
四、依賴屬性的特點

1、依賴屬性宣告為:類的靜態只讀物件;
2、依賴屬性是通過DependencyObject註冊的屬性;
3、依賴屬性讀取是通過DependencyObject的方法讀取;
4、類的依賴屬性只有一份,且由DependecyObject維護。
5、多級繼承,且大多數字段值不改變的情況下,減少記憶體佔比
 DependencyProperty將一個物件依賴屬性儲存在一個全域性的Hashtable中;通過依賴物件(DependencyObject)的GetValue和SetValue存取資料;
6、 依賴屬性值可以通過Binding依賴於其它物件上,這就使得資料來源一變動;依賴於此資料來源的依賴屬性全部進行更新

五、依賴屬性特性應用

1、依賴屬性(值傳遞)繼承
中邏輯樹上實際父級變動,在子級沒有顯式指定值時,預設採用父級的值
 如下圖中:窗體上所有的字型都變大(從20變成了50),並不需要通過設定每個控制元件的屬性;只需要設定窗體的屬性,這個窗體的子控制元件就會適應這一改變,並且使用相同的設定

<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  Title="WPF Example" SizeToContent="WidthAndHeight"
  FontSize="50" FontStyle="Italic"
  Background="Blue">
    <StackPanel>
        <Label FontWeight="Bold" FontSize="20" Foreground="White">
            Hi There!
        </Label>
        <Label>2015 Solidmango</Label>
        <ListBox>
            <ListBoxItem>Item1</ListBoxItem>
            <ListBoxItem>Item2</ListBoxItem>
        </ListBox>
        <StackPanel Orientation="Horizontal" HorizontalAlignment="Center">
            <Button MinWidth="75" Margin="10">Help</Button>
            <Button MinWidth="75" Margin="10">OK</Button>
        </StackPanel>
        <StatusBar>Solidmango</StatusBar>
    </StackPanel>
</Window>

2、屬性的改變通知
CLR屬性只有通過事件響應函式或者回調函式來傳遞屬性性改變; 依賴屬性只需配置就可以(見第三部分的示例)

更詳細的介紹參見依賴屬性的傳遞

五、依賴屬性的優先順序