WPF学习之--属性,依赖属性和依赖对象

一、属性的来龙去脉

程序的本质是“数据+算法”

C#语言规定:对类有意义的字段和方法使用static关键字修饰,称为静态成员;

 静态字段在内存中只有一个拷贝,非静态字段则是每个实例拥有一个拷贝,无论方法是否为静态在内存中只会有一份拷贝。

使用属性的目的就是为了避免把数据直接暴露给外界。

属性就是Get和Set这对方法。

二、CLR属性

 .NET Framework中的属性又称为CLR属性,是private字段的安全访问包装,本质是将一个类中的字段进行封装,以达到控制字段取值以及赋值的目的。

 

   public class Student
    {
        public int id;
        public string name;
        public int age;
    }

//年龄不可能为负值
    public class Student
    {
        public int ID { get; set; }
        public string Name { get; set; }
        private int age;
        public int Age
        {
            get { return age; }
            set
            {
                if (value > 0)
                {
                    age = value;
                }
            }
        }
    }

值得注意的是,WPF的Binding中Path的必须是CLR属性。

三、依赖属性

是一种可以自己没有值,并能通过使用Binding从数据源获得值的属性。

1.节省实例对内存的开销;

在传统的.Net开发中,每一个类对象一旦被创建,它的所有字段也就被分配了存储空间。WPF允许对象在创建时,不包含各个字段所占用的空间,而在使用这个字段时通过其他对象的数据或者实时分配空间,这种对象就是依赖对象,而它这种实时获取数据能力就是依靠依赖属性来实现。
WPF中支持依赖对象的类,需要继承自DependencyObject,依赖属性的类需要继承自DependencyProperty。DependencyObject具有GetValue和SetValue两个方法,其都是以DependencyProperty对象为参数,用于读取和存储依赖属性对象的值,DependencyObject是WPF中很底层的一个基类,WPF所有UI控件都是依赖对象

  public class Student:DependencyObject
  {

        public object GetValue(DependencyProperty dp)
        {
            ...
        }

        public object SetValue(DependencyProperty dp,object value)
        {
            ...
        }

  }

 

2.属性值可以通过Binding依赖在其他对象上。

 

public class Student:DependencyObject
    {
        public string Name//CLR属性外包装
        {
            get { return (string)GetValue(NameProperty); }
            set { SetValue(NameProperty, value); }
        }

        // Using a DependencyProperty as the backing store for Name.  This enables animation, styling, binding, etc...
        public static readonly DependencyProperty NameProperty =
            DependencyProperty.Register("Name", typeof(string), typeof(Student));
    }

如代码所示,

依赖对象的继承自DependencyObject类

成员变量被public static readonly DependencyProperty 修饰,

依赖属性的命名规范是“包装器+Property”。

它的实例由DependencyProperty.Register创建。

private void Button_Click(object sender, RoutedEventArgs e)
{

  Student stu = new Student();
  stu.Name = this.TextBox1.Text;
  TextBox2.Text = stu.Name;

  }

上述所示就是利用依赖属性来存储值并把值读取出来,注意这样子的写法是因为用了CLR属性外包装,这样依赖属性使用时与普通的CLR属性别无二致。

尽管Student类(依赖对象)没有实现INotifyPropertyChanged接口,当属性的值发生变化时,与之关联的Binding对象依然可以得到通知,依赖属性默认带有这样的功能

 

posted @ 2021-08-28 22:14  HelloWorld庄先生  阅读(413)  评论(0编辑  收藏  举报