07_深入浅出话属性

备注:类关系结构图如下:

在这里插入图片描述

Property

引入:06章研究了 Binding 的数据源这一端,本章将目光移向 Binding 的目标端,研究一下什么样的对象才能作为 Binding 的 Target 以及 Binding 将数据送往何处。

属性 (Property) 的来龙去脉

  • Weight 对于人个体有意义,但是对于人类没有意义,Amount 对于人类有意义,但是对于个体没有意义,所以采用静态和非静态,static。
  • 类中通常的属性,区别于字段,又被称为 CLR 属性(CLR, Common Language Runtime),我们可以说 CLR 属性是 private 字段的安全访问包装。

依赖属性 (Dependency Property)

依赖属性引入
  • 简而言之,依赖属性是一种可以自己没有值,并能通过使用 Binding 从数据源获取值(以来在别人身上)的属性,拥有依赖属性的对象被称为依赖对象
  • 依赖属性和传统 CLR 属性区别:
    • 依赖属性可以节省对内存的开销,WPF 允许对象在创建的时候并不包含用于存储数据的空间,只保留需要用到数据时能够获取的默认值、借用其他对象数据或实时分配空间的能力—这种对象就称为依赖对象(Dependency Object)。WPF 开发中,必须使用依赖对象作为依赖属性的宿主,使两者结合起来,才能形成完整的 Binding 目标被数据驱动。
    • 依赖属性可以通过 Binding 依赖在其他对象上。
    • WPF 的所有 UI 控件都是依赖对象。
声明和使用依赖属性
  1. 代码例子:
    在这里插入图片描述
    在这里插入图片描述
    备注:
    • 实例并不是使用 new 操作符得到,而是使用 DependencyProperty.Register 方法生成。
    • 注意:这里 NameProperty 相当于普通类中的字段地位,是依赖属性,而 Name 相当于 CLR 属性,也叫 CLR 属性,也可以叫做依赖属性包装器。
    • 命名约定:依赖属性都是 NameProperty 这样,注意结尾。
    • DependencyProperty.Register 方法参数:第一个参数为 string 类型,指明以哪个 CLR属性 作为整个依赖属性的包装器;第二个参数指明此依赖属性用来存储什么类型的值;第三个参数用来指明此依赖属性的宿主依赖对象是什么类型。
    • 通常 Student 的实例 stu 不具有 SetBinding 方法,除非在代码中重写 SetBinding 方法。
    • 依赖属性的代码块模板快捷键:propdp 连续按两下 Tab 键,可以在提示环境中修改依赖属性的各个参数。

附加属性 (Attacked Properties )

附加属性引入

引入:依赖属性也就是把对象放入一个特定环境才具有的属性,表现出来就是被环境赋予的属性。一个例子就是,不同布局控件(Canvas、DockPanel、WrapPanel、StackPanel和Grid)里面有个 TextBox,该 TextBox 有位置表示,他在不容布局控件里面写法不同,其实他是不同控件都有自己的位置属性(附加属性),然后不同比如 Button 或者 TextBox 来了,他都可以表示布局。和依赖属性不同的是,附加属性写 TextBox 里面,但是依赖属性是写在布局里。

附加属性例子
  • 一个例子:
    在这里插入图片描述
    在这里插入图片描述
    备注:
  • 与依赖属性写法差不多,不同点是注册附加属性使用的是名为 RegisterAttached 的方法;依赖属性使用 CLR 属性对 GetValue 和 SetValue 两个方法进行包装,附加属性则使用两个方法分别进行包装。
  • 附加属性本质上也是一个依赖属性,所以依赖属性的使用他也使用。
  • 附加属性的代码块快捷键是 propa。
  • 该代码中的定义的空类 Human 相当于上面引入中的 TextBox ,可以是 TextBox 也可以是 Button 等,该 School 相当于前面布局控件。
  • 附加属性也可以做依赖属性使用,如下:
    在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_42310008/article/details/112794578
今日推荐