8

我正在努力寻找有关 and 使用的属性继承树(或继承上下文)的足够DependencyObject信息DependencyProperty

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

如果 Object A 和 Object B 派生自DependencyObject,并且不是a 的子级UIElement (换句话说,Object A 是它自己的),那么您如何建立逻辑树以便DependencyProperty理解 B 是 A 的子级?

Hillberg Freezable Trick以及Josh Smith 的技巧包并不是我想要的。我不想从现有元素树中检索属性...我想创建自己的非可视元素树...即控制继承上下文。

有谁知道这个知识体系隐藏在哪里?

4

2 回答 2

11

经过大量研究和混淆源代码后DependencyObject,以下是简短答案:

InheritenceContext显示实例的逻辑父级的属性)(就像 90% 的有用实现DependencyObject一样)标记为内部,因此对 WindowsBase.dll 之外的所有代码都隐藏

可以使用反射来设置_contextParent字段,也可以调用这个隐藏的方法来设置InheritenceContext,但归根结底,它不是一个干净的解决方案。

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

于 2009-03-06T08:12:51.177 回答
0

我假设您正在询问将值传播给不覆盖值本身的孩子。

ContentControl据我所知,WPF 元素有一个子元素的概念已经介绍过了。这在层次结构中比您想要的更深入。因此,我假设如果您只是从中得出DependencyObject这种行为不会表现出来。

具体来说,孩子需要知道询问其父母是否没有给定属性的值。

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

于 2009-03-05T13:28:58.147 回答