好久没写Silverlight了,依赖属性(Dependency Property)和附加属性 (Attached Property)这两个算是很基础的知识都不是很记得了。写一写,当做 一下笔记吧。
CLR属性 与 依赖属性
CLR属性我们非常熟悉了,在DotNet编程中随处可见。最简单最常见的属性访 问器就是直接操纵类的私有成员,如下:
public class Person
{
private String _name;
public string Name
{
get { return _name; }
set { _name = value; }
}
}
C#3.0对这种常见的写法提供了“自动属性”这一特性,方便了偶等这些懒惰 的码农。
public class Person
{
public string Name { get; set; }
}
这两种写法是等价的,都是需要设立一个实例级的私有变量作为属性访问器的 持久存储。这对于我们非UI应用来说没什么。因为第一,我们一般不会创建太多 类实例;第二,一个类的属性通常不会很多,加几个私有变量不会增加系统负担 。但是这两个理由对于UI应用程序来说恰恰不成立。
在很多UI应用中,我们经常会创建很多类实例,成千上万个实例在UI系统中是 很普遍的事情。同时,UI类通常会包含大量的属性供设计人员使用,例如背景颜 色,前景颜色,字体,边距等等,这些属性在绝大多数情况下会保持默认值,如 果为每个实例都建立这么多的私有变量来存储UI属性的值,势必会造成极大的浪 费,对系统负担的开销也是不小。
鉴于以上提到的问题,设计一个高效的属性存储系统对于UI应用程序的开发是 非常重要的。因此Silverlight引入了“依赖属性(DependencyProperty)”。
采用键值对替代成员变量作为属性内部存储
传统CLR属性,一个属性对应一个私有变量,UI元素的属性那么多,创建过多 的私有变量不是一件简单的事情,况且大多数属性只会用到默认值。因此 Silverlight使用键值对的形式来存放那些用户显式设置的属性(称为Local Value本地值),没有设置的属性就不存。那属性的默认值存放在哪?既然各个实 例的默认值都一样(不然也不叫默认值了),那么直接存放到静态成员变量上就 行了。这也就大大提高了存储的效率。