自定义DependencyObject继承树

时间:2009-03-05 12:46:33

标签: .net wpf dependency-properties dependencyobject

我很难找到有关DependencyObjectDependencyProperty使用的属性继承树(或继承上下文)的足够信息。

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

如果对象A和对象B来自DependencyObject,并且不是 UIElement的子项(换句话说,对象A是它自己的 root ),那么如何建立逻辑树以便DependencyProperty能够理解B是A的孩子?

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

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

2 个答案:

答案 0 :(得分:10)

经过大量研究并混淆了DependencyObject的源代码,这里的答案很简短:

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

可以使用反射来设置DependencyObject字段,以及调用此隐藏方法来设置_contextParent,但在一天结束时它不是一个干净的解决方案。 / p>

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

答案 1 :(得分:0)

我假设您正在询问将值传播给不会自行覆盖值的子项。

据我所知,ContentControl引入了一个有孩子的WPF元素的概念。这在层次结构中比你想要的更进一步。所以,我认为如果你只是从DependencyObject推导出这种行为不会表现出来。

具体而言,孩子需要知道询问其父母是否没有给定财产的价值。

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