上海TZ
上海TZ
关注数: 0
粉丝数: 0
发帖数: 8
关注贴吧数: 0
WPF之Dependency Property 一 引入DependencyProperty 这个概念可以说是WPF核心中的核心了。在WPF的框架中随时都能见到它的身影。关于DependencyProperty能带来的诸多方便,很多介绍性的文章里都有,我这里就不介绍了,今天先从什么是DependencyProperty说起。 从属性开始属性 在CLR中有属性(Property)这个概念,它可以用来封装字段。 这种属性应用的非常多,我们还可以在set或get方法中加入某些逻辑,确定读取或者设置属性的值的时候我们是不是需要某些其他的判断,一个经典的例子是在Age属性的set方法中加入对年龄范围的判断。这些就不多说了。 private string _myString; public string MyString { get{return _myString;} set{_myString=value;} } 但是WPF框架的编程经常和界面打交道,经常遇到的一个情况是某个属性的值的变化会影响到多个其他对象。比如当一个Button的改变大小超过了它的容器,他的容器应该自动调整大小。于是我们考虑在每个属性的set方法中触发一些事件,但很快我们发现现有的功能很难满足我们的需求,至少不能简洁漂亮的满足这些需求。 实际上我们的需求更加复杂,WPF中的数据绑定,XAML语法等很多地方都和属性密切相关,我们迫切需要一种功能更加强大的属性。 于是在WPF中,引入了一种特殊的属性,Dependency Property。这种属性和普通的属性最大不同在于,它的值的来源并不单一。对这种属性的取值和赋值都会能与其他对象有影响,因此能得到很大的灵活性。 这很抽象,也许很难懂。不明白不要紧,先接着看。一步步来,先看看DependencyProperty长什么样,从定义DependencyProperty开始: public static readonly DependencyProperty MyStringProperty = DependencyProperty.Register( "MyString", typeof(string), typeof(ClassMyDependency), new PropertyMetadata("defaultValue", new PropertyChangedCallback(onMyStringPropertyChange))); 一眼看上去很复杂,首先使用public static readonly的方式(其实就是设计模式里的单键 这是.net里的一种简单实现)定义了一个全局的DenpendencyProperty成员,这个成员的值通过DependencyProperty的Register方法获得,这个成员我们称做DependencyProperty标识。 我们传入了一些参数,分别表示属性名,属性类型,父元素(也就是包含属性的元素)类型,属性元数据(这些以后再详细介绍)。 要注意的是, 虽然我们定义的名称是MyStringProperty,但是属性的名称不是成员的名称,它由第一个参数指定.这个Property的后缀不是可选的,虽说不按照这个规则编译能通过,但是.net中很多地方都遵循了这种规则,这里我们了解这个规则并保证自己定义的 DependecyProperty都遵循它就行了,以后会有更详细的解释. 实际上我们得到了一个属性的标识,这个数据是全局的且是唯一确定的,当需要访问属性的值时,只需要调用对象的GetValue()和SetValue()方法来访问()。语法是:
1
下一页