2024年3月11日发(作者:)

WPF里的DependencyProperty(4)

首先回顾一下上一篇Post提出来的三个问题。

我只定义了一个静态的DependencyProperty类,在实例中并没有提供一个成员变

量或是什么地方存储这个属性的值,那么这个值存储到什么地方了呢?

上一篇Post提到的“反射”问题。不论在数据绑定还是动画中我们都只提供了一个

属性名字符串,难道WPF真的需要使用反射读取属性数据?

如果我们在动画进行时同时通过Slider来改变DependencyProperty的值,会发生

什么?此时Property中到底存储了来自哪里的值,是原始我们赋给的值?是数据绑定的

值?还是当前动画的值?此时我们通过GetValue方法,会得到什么样的值呢?

解决这些问题,我们需要了解一些DependencyProperty的工作机制,这也就是今天

的主要内容。下面就开始。

尝试DIY一个DependencyProperty

Microsoft总是封装好了一切,并给我们一个“最佳实践”,让我们照着MSDN抄

代码。照猫画虎写代码谁都会,但是DependencyProperty到底是如何工作的呢?

从上面的例子我们已经看到,DependencyProperty需要处理例如:

TargetProperty="Transparency"这样对属性的访问,也就是通过字符串获取属性的值。

下面我们先假设我们自己是WPF team的一员,我们如何来实现上面的功能呢?如

果是我,我可能会考虑写出类似下面这样的代码:

public static object GetValueUsingReflaction(object obj, string propertyName)

{

return e().GetProperty(propertyName).GetValue(obj, null);

}

public static void SetValueUsingReflaction(object obj, string propertyName,o

bject value)

{

e().GetProperty(propertyName).SetValue(obj,value,null);

}

我使用反射读取除了属性的值,这样没有问题,不过也许你开始考虑性能问题了。前

面中说过,反射是“贵族”功能,十分损耗性能,而我们这边仅仅是使用了反射的众多功

能中的一样:寻找属性的元数据,然后GetValue。因此,我们也不用考虑比如如何获得方

法签名等等复杂的问题。