加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-14 05:42:34 所属栏目:百科 来源:网络整理
导读:依赖属性的好处大家可以参见前面我转载的博文。我们知道,WPF中控件的属性非常多,但这些属性中大部分你在编程过程中是不会改变设置的,而是直接利用其默认值(所以以后设计属性时,默认值的选择也非常关键,这有利于减少存储),如果采用原来的属性方式,每

依赖属性的好处大家可以参见前面我转载的博文。我们知道,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; ??????? } ??? }

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读