模拟实现WPF的依赖属性及绑定通知机制1--依赖属性 .

http://www.jb51.cc/article/p-clbqemtb-bcq.html

分类: 2、Silverlight 1、C# 4、学习笔记 224人阅读 评论(0) 收藏 举报

依赖属性的好处大家可以参见前面我转载的博文。我们知道,WPF中控件的属性非常多,但这些属性中大部分你在编程过程中是不会改变设置的,而是直接利用其默认值(所以以后设计属性时,默认值的选择也非常关键,这有利于减少存储),如果采用原来的属性方式,每个类的实例都会有自己的一份属性值集合,哪怕都是缺省值。这样做从存储上来讲当然是不划算的,因此可以将缺省值存在类里面,而只有改变了的与默认值不同的值才存在实例里面,然后按照一定的逻辑顺序来访问属性值即可,这就是依赖属性的基本思想。

下面我们开始模拟这套机制来实现我们自己的依赖属性:

1)依赖属性

其实依赖属性类就是一个包含属性相关设置的类,本身没有什么特别之处,依赖属性提供了一个静态的依赖属性实例化的工厂方法:

/// <summary>
/// 依赖属性类,这个类一般来讲是不允许继承的,而且也不能被外界实例化,
/// 就只能采用工厂方法进行注册构建。
/// </summary>
public class MyDependencyProperty
{
private Type _propertyType;

public Type PropertyType
{
get { return _propertyType; }
}
private Type _ownerType;

public Type OwnerType
{
get { return _ownerType; }
}
private string _name;
private object _defaultValue;
private MyPropertyMetadata _propertyMetadata;

public MyPropertyMetadata PropertyMetadata
{
get { return _propertyMetadata; }
}
public object DefaultValue
{
get
{
if (_propertyMetadata != null)
{
return _propertyMetadata.DefaultValue;
}
return null;
}
}
public string Name { get { return _name; } }
//构造函数私有化保证只能由类的静态方法实例化.当然,如果为public也是可以的,这里做只是为了统一构造入口,
//便于管理和维护。
private MyDependencyProperty(string name,Type propertyType,Type ownerType,MyPropertyMetadata propertyMetadata)
{
_propertyType = propertyType;
_ownerType = ownerType;
_name = name;
_propertyMetadata = propertyMetadata;

}
//依赖属性实例化工厂方法类.
public static MyDependencyProperty Register(string name,MyPropertyMetadata propertyMetadata)
{
if (propertyMetadata != null && propertyMetadata.DefaultValue.GetType() != propertyType)
{
throw new Exception(string.Format("the type of defaultValue is not {0}",propertyType.Name));
}

MyDependencyProperty dp = new MyDependencyProperty(name,propertyType,ownerType,propertyMetadata);

return dp; } }

相关文章

什么是设计模式一套被反复使用、多数人知晓的、经过分类编目...
单一职责原则定义(Single Responsibility Principle,SRP)...
动态代理和CGLib代理分不清吗,看看这篇文章,写的非常好,强...
适配器模式将一个类的接口转换成客户期望的另一个接口,使得...
策略模式定义了一系列算法族,并封装在类中,它们之间可以互...
设计模式讲的是如何编写可扩展、可维护、可读的高质量代码,...