DependencyProperty深入浅出
写这篇心得之前,看到博友一句话:需求是推动发展的原动力。
说得好,说的棒,说到了点子上,说到了心里去;
好我们开始
最初的世界是简单的,甚至比单细胞动物还简单:
普通属性定义
public class Cell{
private double _Size;
public double Size{get;set;}
}
Size属性是以Cell对象作为‘宿主‘,随着生物进化,出现多细胞生物,腔肠动物,棘皮动物,扁形动物,带脊柱鱼类,猿,类人猿,原始人,人...团体、政党、社会
国家、世界、宇宙...
Cell不不断进化演化发展中,对象变得异常复杂庞大
回过头来看看依赖属性到底要解决普通属性所不能解决的什么问题呢?
1. 派生类原原本本继承了父类的所有属性,公共的、私有的;而且许多属性直接间接被继承来却基本不会被应用,每个属性实例化后对象的复杂与臃肿成为需要解决问题。
2. 属性的变更不能及时反馈到性状,就好比人的身体的某个细胞破损,神经系统不会向大脑反馈任何信息。
依赖属性为解决普通属性存在的这些问题,当然不限于这些问题
在WPF中,依赖对象的概念被DependencyObject类实现;依赖属性的概念则由DependencyPorperty类实现。
必须使用依赖对象作为依赖属性的宿主,二者结合起来,才能实现完整的Binding目标被数据所驱动。DependencyObject具有GetValue和SetValue两个方法,用来获取/设置依赖属性的值。DependencyProperty必须以DependencyObject为宿主、借助它的SetValue和GetValue方法进行写入和读取。因此,想用自定义的DependencyProperty,宿主一定是DependencyObject的派生类。
总结下DependencyProperty实例的声明特点和使用:
1. 变量由public static readonly三个修饰符修饰
2. DependencyProperty 类型
3. 实例使用DependencyProperty.Register方法生成。*而非new操作符得到*
4.使用SetValue和GetValue方法进行写入和读取
对比下普通属性定义与依赖属性定义
public class Cell{
//定义一个SizeProperty依赖属性
public static readonly DependencyProperty SizeProperty=DependencyProperty.Register("Size",typeof(double),typeof(Cell));
//普通属性定义
private double _Size;
public double Size{get;set;}
}
现在使用这个最简单的依赖属性
Cell cell=new Cell();
cell.SetValue(Cell.SizeProperty,textbox1.Text);
textbox2.Text=(double)cell.GetValue(Cell.SizeProperty);
这样使用依赖属性,所有人都会有意见:可不可以像访问普通属性那样简单方式访问依赖属性
为依赖属性添加一个CLR属性的外包装:
public class Cell{
//定义一个SizeProperty依赖属性
public static readonly DependencyProperty SizeProperty=DependencyProperty.Register("Size",typeof(double),typeof(Cell));
public double Size{
get{return (double)GetValue(SizeProperty)};
set{SetValue(SizeProperty,value);}
}
于是,我们也可以这样访问依赖属性了
Cell cell=new Cell();
cell.Size=textbox1.Text;
textbox2.Text=cell.Size;
当敲多了依赖属性的CLR属性的外包装定义,写起来比普通属性定义麻烦,有没有简单办法
vs环境,敲出p+tab+tab,即可自动生成;
备注:
prop:CLR属性
propa:附加属性
propdp:依赖属性
这篇博客值得推荐,深入浅出,易学易懂
http://www.cnblogs.com/Zhouyongh/archive/2009/09/10/1564099.html