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

http://blog.csdn.net/hawksoft/article/details/6726161

 分类: 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, Type propertyType, Type ownerType,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;
        }
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值