WP7中的DependencyProperty

shushamei 发布于 2012/07/14 22:17
阅读 136
收藏 1

原来不知道什么意思,今天专门研究了下这个类。下面我看到的一片博文摘下来,看过之后就明白了。一句话理解的话就是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揭秘》描述的还有另一个好处:对多个提供程序的支持,关于这个话题可以查阅该书。
加载中
返回顶部
顶部