模拟实现WPF的依赖属性及绑定通知机制(2)--依赖对象的准备

依赖对象一个主要的功能就是提供对依赖属性属性值的管理,所有需要具有依赖属性的类都可以从这里继承,而无需自己去管理依赖属性值。依赖对象的主要方法就是SetValue和GetValue两个方法,这也是依赖属性和普通属性获取值不一样的地方,当然实际的应用中依赖属性一般不会直接使用这两个方法,而是封装成普通属性方式。另外对于依赖属性,我们还提供了一个属性值发生变化时依赖对象可以截获的回调机制,这样做的目的是增加对依赖属性的控制,但需要注意的是这个控制是针对类的,而不是实例,因此处理的时候需要注意到这个特性。

1)为了提供这个特性我们需要定义一个用于回调的委托:

public delegate void MyPropertyChangedCallback(MyDependencyObject d, MyDependencyPropertyChangedEventArgs e);

2)定义一个所谓的元数据类,其实就是为了记载确实值,回调参数的类

/// <summary>
    /// 属性元数据类,目标是为了存储属性的缺省值和值发生变化时的回调函数
    /// 其实在注册依赖属性的时候,可以直接将该类的成员加上,但这样的做法不利于扩展,
    /// 因为你可以继承这个MyPropertyMetadata这个类,增加信息量,而不需要更改依赖
    /// 属性的结构。
    /// </summary>
    public class MyPropertyMetadata
    {
        public MyPropertyChangedCallback PropertyChangedCallback { get; private set; }
        public object DefaultValue { get; private set; }
        public MyPropertyMetadata(object DefaultValue = null, MyPropertyChangedCallback Callback=null)
        {
            this.PropertyChangedCallback = Callback;
            this.DefaultValue = DefaultValue;
        }
    }

3)参数定义如下:(这里我只是在微软相关类的基础上做了小修改)

 /// <summary>
    /// 属性发生改变时的参数
    /// </summary>
    public class MyDependencyPropertyChangedEventArgs
    {
      
            // 摘要:
            //     获取发生更改之后的属性的值。
            //
            // 返回结果:
            //     发生更改之后的属性值。
        public object NewValue { get; private set; }
            //
            // 摘要:
            //     获取发生更改之前的属性的值。
            //
            // 返回结果:
            //     发生更改之前的属性值。
        public object OldValue { get; private set; }
            //
            // 摘要:
            //     获取发生值更改的依赖项属性的标识符。
            //
            // 返回结果:
            //     发生值更改的依赖项属性的标识符字段。
        public MyDependencyProperty Property { get; private set; }
        public MyDependencyPropertyChangedEventArgs(object NewValue, object OldValue, MyDependencyProperty Property)
        {
            this.NewValue = NewValue;
            this.OldValue = OldValue;
            this.Property = Property;
        }

    }

4)除了上述的功能,我们还要提供WPF的绑定机制的模拟,因此我们在依赖对象类中还提供了对绑定的管理和处理,下面是绑定的定义,比微软的要简化很多:

/// <summary>
    /// 绑定设置类。
    /// </summary>
    public class MyBinding
    {
        public object TargetObject { get; set; }
        public string PropertyName { get; set; }
    }

这个类主要提供对绑定目标对象和属性的记载,我这里是模拟,我没有采用Path路径方式,但原理跟属性差不多,只不过要进行简单的语法分割,形成一个属性路径而已。


原文链接: http://blog.csdn.net/hawksoft/article/details/6726189

你可能感兴趣的:(模拟实现WPF的依赖属性及绑定通知机制(2)--依赖对象的准备)