昨天学习了自定义控件,今天就学习为控件添加自定义属性,找到了万事大吉老师的博客,很顺利第实现了一遍,转过来。
http://www.cnblogs.com/wsdj-ITtech/archive/2009/07/17/1525416.html
public static DependencyProperty TextProperty;
静态属性在静态构造函数中初始化,先看代码:
static SimpleButton()
{
TextProperty = DependencyProperty.Register("MyText",
typeof(string),
typeof(SimpleButton),
new PropertyMetadata("默认值", new PropertyChangedCallback(SimpleButton.OnTextPropertyChanged)));
}
DependencyProperty应该由DependencyProperty.Register创建,在MSDN中,这个函数的原型如下:{
TextProperty = DependencyProperty.Register("MyText",
typeof(string),
typeof(SimpleButton),
new PropertyMetadata("默认值", new PropertyChangedCallback(SimpleButton.OnTextPropertyChanged)));
}
public static DependencyProperty Register(
string name,
Type propertyType,
Type ownerType,
PropertyMetadata typeMetadata
)
string name,
Type propertyType,
Type ownerType,
PropertyMetadata typeMetadata
)
其中name是属性在XAML中使用的名字,propertyType则是属性的类型,注意这个属性理论上可以是任何类型,但是一般只使用整数、布尔、字符串、还有UI元素这些类型,其它类型需要定义复杂的字符串到对象的属性文法作为转换规则(之后可能会单写一篇blog讲converter)。ownerType就是我们自己定义的类了。typeMetadata有点复杂,PropertyMetadata构造函数有3个重载,提供选择指定defaultValue和propertyChangedCallback中任意一个或者同时指定2个。原型如下:
public PropertyMetadata
(
Object defaultValue,
PropertyChangedCallback propertyChangedCallback
)
(
Object defaultValue,
PropertyChangedCallback propertyChangedCallback
)
defaultValue是属性的默认值没什么可说,propertyChangedCallback也很简单,就是当属性改变时的处理函数,这个是把属性同我们的类联系起来的关键了,PropertyChangedCallback 是个委托类型,它的签名也可以在MSDN查到:
public delegate void PropertyChangedCallback
(
DependencyObject d,
DependencyPropertyChangedEventArgs e
)
(
DependencyObject d,
DependencyPropertyChangedEventArgs e
)
下面是我们对MyText属性的具体实现(这个尤其重要,没这个代码单单看前面的实现不了):