WP7中的DependencyProperty

原来不知道什么意思,今天专门研究了下这个类。下面我看到的一片博文摘下来,看过以后就明白了。一句话理解的话就是c#实现类的属性的另外一种方法。c#

 

DependencyProperty在WPF中是一个至关重要的概念,几乎在WPF的应用中都应该会使用到它。可是对于刚从WinForm转过来的人可能会不觉得然,仍然使用原来的属性书写方法(定义一个数据成员,而后给这个成员添加一个属性),不是说不能这样使用,可是在WPF中使用DependencyProperty会更高效,并且更加便捷。下面是我学习DependencyProperty的总结。函数


一.实现一个标准的依赖属性
public class SimpleButton : ButtonBase
{
    public static readonly DependencyProperty IsSimpleProperty;
}
首先它必须是DependencyProperty类型;第二,它必须使用public和static修饰符;第三,必须使用Property做为后缀。

咱们能够经过使用DependencyProperty.Register(...)函数来建立依赖属性,该函数有3个重载,经过Register函数的参数,能够告诉WPF如何处理依赖属性(详见MSDN,对Register的描述),
public class SimpleButton : ButtonBase
{
    public static readonly DependencyProperty IsSimpleProperty;
    static SimpleButton()
    {
        IsSimpleProperty = DependencyProperty.Register("IsSimple", typeof(bool), typeof(SimpleButton), ...);
    }

    public bool IsSimple
    {
        get{return (bool)GetValue(IsSimpleProperty);}
        set{SetValue(IsSimpleProperty, value);}
    }
}
看了上面的代码你可能会怀疑可否正常运行?IsSimpleProperty是static变量,而咱们的IsSimple是成员变量,若是有两个SimpleButton实例的话不就使用了相同的数据了?有这样的怀疑是应该的,可是你可知道GetValue和SetValue可不是简单的函数。[参考<<WPF揭秘>>]GetValue和SetValue的实现使用了很高效的稀疏存储系统,它会帮咱们管理这些数据,因此上面的怀疑大可没必要。并且更重要的是它能够为咱们节省内存,这是使用依赖属性的一大好处,由于依赖属性是静态的成员,没必要每一个实例生成一个成员数据,全部的数据被统一块儿来管理,这样固然能够节省不少内存了,特别是成员变量比较多的时候。既然有这样的好处咱们有什么理由不使用它呢?除了这些做用,依赖属性还有两外的几个好处,下面将详细描述。
GetValue和SetValue这两个函数是来之类DependencyObject,也就是说想要实现依赖属性,必须保证你的类是一个DependencyObject。

二.依赖属性的好处
除了上面说的节省内存的好处,另外还有几个好处,分别是:属性继承,变动通知。
1.属性继承,这个继承有别于父类和子类之间的继承,它是指修改了某个依赖属性,它的变动会应用到子控件中具备相同属性的控件。按照《WPF揭秘》说的就是:属性值自顶向下沿着元素树进行传递。要具备这个继承的的功能咱们只须要把原数据FrameworkPropertyMetadataOptions.Inherits做为参数传给Register就OK了。   这里值得注意的是继承可以被高优先级的源的设置阻断,好比StatusBar,它是有主题样式设置程序来设置的,若是你把它包进一个Window中,而且这个Window设置了某些StatusBar具备的依赖属性,可是你会发现你的设置并无影响到StatusBar.(该例子来之《WPF 揭秘》)。下面列出设置依赖属性的程序的优先级(来自《WPF揭秘》,详细请查阅该书):
(1)本地值 :即SetValue。
(2)样式触发器
(3)模板触发器 
(4)样式设置程序 
(5)主题样式触发器 
(6)主题样式设置程序 
(7)属性值继承 
(8)默认值 :初始化的值。
2.变动通知比较容易理解,指的是若是依赖属性改变了,那么它就自动地帮咱们发出通知,告诉好比像Trigger这样的东西。若是要本身实现这个通知的话咱们必需要去实现INodifyPropertyChanged接口,而后每次改变的时候去触发属性改变的事件,因此依赖属性确实给咱们提供了很多方便。

根据《WPF揭秘》描述的还有另外一个好处:对多个提供程序的支持,关于这个话题能够查阅该书。
相关文章
相关标签/搜索