依赖对象一个主要的功能就是提供对依赖属性属性值的管理,所有需要具有依赖属性的类都可以从这里继承,而无需自己去管理依赖属性值。依赖对象的主要方法就是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路径方式,但原理跟属性差不多,只不过要进行简单的语法分割,形成一个属性路径而已。 |