WPF笔记之属性和依赖属性

属性

        新来的MM埋头学习C#,有一天跑来问我:“师兄,什么是属性?”我对她说:“学姐,我也是新来的。”

    记得MSDN的文档里介绍说:C#的类里有Property和Attribute,对于我这个英语一般般的人是一个考验,Property和Attribute不是同义词吗?嗯,是的,谷歌的翻译也是一样的,这就造成了理解的困难,下面介绍一下到底什么是Property,什么事Attribute。

    经过我不懈的理解,不断的理解,不停的理解,我可以很明确的告诉你,Property就是Attribute,不信的话我们来看一段代码(代码一):

using System;

class PropertyAndAttribute
{
        private string name;
        private int age;

        public string getName() {
            return name;
        }
        public void setName(string name) {
            this.name = name;
        }
        public int getAge() {
            return age;
        }
        public void setAge(int age) {
            this.age = age;
        }
}
    上面这段代码声明了两个attribute,也就是字段,这个在
java里也可以这么定义,不过C#为我们提供了另一种更简洁的书写
方式,下面代码(代码二):
using System;

class PropertyAndAttribute
{
     private string name;
     private int age;
     public string Name
     {
         get;
         set;
     }
     public int Age
     {
         get;
         set;
     }
}
这样是不是就很简洁了,如果你感觉还是不爽的话,C#还有一种写
法,见下面代码(代码三):
class PropertyAndAttribute {
    public string Name
    {
        get;
        set;
    }
    public int Age
    {
        get;
        set;
    }
}
这样的代码是不是很简单,这就是C#里的属性声明方式,这种声明
表面上看好像没有定义字段,但是其实编译器还是为我们的代码自
动生成了一个匿名的备份字段,这点可以通过反编译生成的代码看
出来,由此可见,C#里的属性其实是字段的变种,这一点对于我们
理解依赖属性至关重要。

依赖属性

        依赖属性,我们首先要明确一个概念,依赖属性依然是一个属性,也就是说依赖属性依然是一个字段,可是同样都是字段,为什么它会叫做依赖属性呢?它肯定有它的特殊之处,下面我就我今天下午的理解给大家解释一下,首先我们看一段声明依赖属性的代码(代码四):

public partial class MainWindow : Window
    {
        private static DependencyProperty myProperty;

        public MainWindow()
        {
            InitializeComponent();
            myProperty = DependencyProperty.Register("CustomProperty",//依赖属性的名称
                typeof(string),//依赖属性的类型
                typeof(MainWindow),//依赖属性的所有者
                new PropertyMetadata("属性默认值",callBackFunction));//依赖属性值发生改变时触发的函数
        }
        //依赖属性值改变的触发函数
        public void callBackFunction(DependencyObject obj, DependencyPropertyChangedEventArgs args)
        {
            MessageBox.Show(this.GetValue(myProperty).ToString());
        }
    }
原文地址:https://www.cnblogs.com/alephsoul/p/1981962.html