首先它必须是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揭秘》描述的还有另外一个好处:对多个提供程序的支持,关于这个话题能够查阅该书。