依赖属性 DependencyProperty

解决的问题:一个控件可能有几百个CLR属性,如果每个CLR属性都是包装一个字段,那么这个控件耗费的内存太大了。依赖属性就是解决这个问题的。

如何解决这个问题:使控件的CLR属性不是包装字段,而是包装一个DependencyProperty,并且这个DependencyProperty的内存不是分配在控件内,而是采用某种机制分配在外部,以key-value的形式存在。另外,DependencyProperty还解决了一个问题,当DependencyProperty作为绑定源的时候,还能自动更新绑定目标的显示。


依赖属性的理解:

1、依赖属性就是可以自己没有值,通过binding 从数据源获得值的属性,也就是依赖在别人身上的属性。

2、只有依赖属性可以binding到别人身上,CLR属性不能binding到别人身上。

3、那为什么在XAML代码中会有如下的情况?

  <TextBox Name="textBox2" Text="{Binding ElementName=textBox1,Path=Text}"/>

    就是把textBox2的CLR属性Text绑定到别人身上,这只是表面现象。实际上,上面的XAML等价的C#代码为:

    this.textBox2.SetBinding(TextBox.TextProperty, new Binding("Text") { ElementName="textBox1"});

    SetBinding的方法定义为 :SetBinding(DependencyProperty dp, BindingBase binding);

4、有没有包装器,依赖属性都存在。那为什么还要使用CLR属性对依赖属性包装?

    上面讨论的是依赖属性binding到别人身上,假如别人binding到依赖属性上,该怎么办呢? CLR属性包装器的作用就是:以“实例属性”的形式向外界暴露依赖属性,这样依赖属性就能成为数据源的Path。需要特别注意的是,当数据源的Path为依赖属性,会自动通知Target更新显示。 

原文地址:https://www.cnblogs.com/nzbbody/p/2742198.html