原文:WPF属性(一)依赖属性

依赖属性是一种可以自己没有值,并能通过使用Binding从数据源获得值的属性,拥有依赖属性的对象称为依赖对象,在传统开发中,一个对象所占用的内存在调用new操作符进行实例化的时候就已经决定了,而WPF允许对象在被创建的时候并不包含用于存储数据的空间,只保留在需要用到数据时能够获得默认值、借用其他对象数据或实时分配空间的能力,这种对象就是依赖对象,而这种实时获取数据的能力就是靠依赖属性来实现。

WPF中,依赖对象的类型是DependencyObject,依赖属性的类型是DependencyProperty,DependencyObject具有GetValue和SetValue两个方法:

        public object GetValue(DependencyProperty dp)
{ } public void SetValue(DependencyProperty dp, object value)
{ }

WPF中所有的控件都是依赖对象,依赖属性必须以依赖对象为宿主,借助它的SetValue和GetValue方法进行写入与读取,因此,想使用自定义的依赖属性,宿主一定是依赖对象的派生类,依赖属性有public static readonly三个修饰符修饰,实例使用DependencyProperty.Register方法生成,例如:

public static readonly DependencyProperty NameProperty = DependencyProperty.Register("Name", typeof(string), typeof(Student));

依赖对象可以通过Binding依赖在其他对象上,即依赖对象是作为数据的目标而存在,所以需要为依赖对象的依赖属性添加了CLR属性包装,有了这个包装,就相当于为依赖对象准备了用于暴露数据的Binding Path

        public int MyProperty
{
get { return (int)GetValue(MyPropertyProperty); }
set { SetValue(MyPropertyProperty, value); }
}

还可以自定义一个SetBinding方法用于简化绑定操作

        public BindingExpressionBase SetBinding(DependencyProperty dp, BindingBase binding)
{
return BindingOperations.SetBinding(this, dp, binding);
}

有一个小技巧,需要申明一个依赖属性并使用CLR属性封装时,只需要输入propdp,vs就会给出一个提示,连按两次tab键,一个标准被依赖属性就申明好了,继续按tab键,可以修改依赖属性的各个参数。

最新文章

  1. *HDU3635 并查集
  2. 基于jstree的 对混乱的 命名系统进行归类的 计算机软件
  3. nginx地址重写
  4. G面经prepare: Straight Partition of A Deck of Cards
  5. android定时三种方式
  6. Adobe Photoshop CC 14.0简体中文特别版32位和64位下载
  7. linux C(hello world) 二维数组的练习
  8. javascript背景淡入淡出
  9. linux编译安装LAMP
  10. Hibernate注解错误之- org.hibernate.MappingException: Could not determine type for:
  11. Log4j实现对Java日志的配置全攻略
  12. 我眼中的C#3.0 摘自于网络:http://www.cnblogs.com/joinger/articles/1297237.html
  13. 常规流(Normal flow)
  14. R画图的颜色搭配
  15. 改变eclipse默认的Tomcat部署路径
  16. 数据库和Django model 生成和反向生成
  17. spring mvc的工作原理
  18. 基于Vue.js的uni-app前端框架结合.net core开发跨平台project
  19. 《Java 程序设计》课堂实践项目 课后学习总结
  20. ( 递归 )Fractal -- POJ -- 2083

热门文章

  1. (一一六)新浪微博client的离线缓存实现思路
  2. php实现 字符个数统计
  3. [Vue] Use Vue.js Watchers to Respond to Async Updates
  4. SetProcessWorkingSetSize() 方法使内存降低了很多(把内存放到交换区,其实会降低性能)——打开后长时间不使用软件,会有很长时间的加载过程,原来是这个!
  5. alloc init初始化后对象依然还在父视图
  6. [TypeScript] Create a fluent API using TypeScript classes
  7. 小米再迎两位重量级人才,原亦庄国投CEO王晓波入职产投部(产业嗅觉)
  8. 物理引擎UIDynamic
  9. 关于Boolean类型做为同步锁异常问题
  10. Input ANR处理流程