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

183人阅读 评论(0) 收藏 举报

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

相关文章

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