2009-03-05 106 views
8

我很努力地找到有关DependencyObjectDependencyProperty所使用的属性继承树(或继承关系上下文)的足够信息。自定义DependencyObject继承树

我想在典型的WPF页面之外使用DependencyProperty的值继承能力,例如对象A是逻辑父对象B,因此分配给对象A属性的值将自动传播到对象B除非它已经在本地设置(有点像WPF中的FlowDirection属性)。

如果对象A和对象B从DependencyObject derieved,和是不是儿童UIElement(换句话说,对象A是它自己的),那么你如何建立逻辑树,以便DependencyProperty明白B是A的孩子?

Hillberg Freezable Trick以及Josh Smith's bag of tricks不是我所期待的。 I 不要想要从现有元素树中检索属性...我想创建自己的非可视元素树...即控制继承上下文。

任何人都知道这个知识体在哪里隐藏?

+1

我很好奇你是如何最终解决你的问题的。你编写了自己的树/继承/ DP机制吗?找到任何图书馆来帮助你的方式吗?我试图做类似的事情。 – 2009-09-03 02:14:58

回答

10

经过大量的研究,并通过DependencyObject源代码得过且过,这里的答案很简单:

InheritenceContext(这揭示了一个实例的逻辑父属性)是(像DependencyObject有用实施90% )标记为内部的,从而从所有代码保持隐藏WindowsBase.dll中的外

,能够使用反射来设置_contextParent字段,以及调用这个隐藏方法来设置InheritenceContext,但在结束时这一天它不是一个干净的解决方案。

经过精练DependencyObject源代码后,我得说我没有留下深刻的印象。 DependencyObject可以而且应该是一个非常干净,无处不在,可重用的课程。 相反,它在结构上和行为上都与它的继承者绑定,甚至包含特定的常量,字段,方法和变通方法,以帮助Freezable与其他子类共存,这不仅远离了良好的OO设计,但也使WPF框架之外完全无法使用的超类。

+1

欢呼声回答这个有趣的问题。可惜这些属性需要特定的基类,但我想不出更好的语言/编译器支持的解决方案(与Freezable相同)。 – 2009-03-08 16:09:32

0

我假设你问的是值的传播给不覆盖值的孩子本身。

据我所知,有一个孩子的WPF元素的概念是由ContentControl引入的。这要比你想去的更进一步发挥作用。所以,我会假设,如果你只是从DependencyObject得出这种行为不会表现出来。

具体来说,一个孩子需要知道询问其父母,如果它没有给定财产的价值。

有趣的问题。我想知道完整的答案。