我很难找到有关DependencyObject
和DependencyProperty
使用的属性继承树(或继承上下文)的足够信息。
我想在典型的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并不是我想要的。我不想要从现有元素树中检索属性...我想创建自己的非可视元素树...即控制继承上下文。
任何人都知道这些知识隐藏在哪里?
答案 0 :(得分:10)
经过大量研究并混淆了DependencyObject
的源代码,这里的答案很简短:
InheritenceContext
(显示实例的逻辑父级的属性)(标记为内部的90%的有用实现)标记为内部,因此对WindowsBase之外的所有代码保持隐藏.dll
可以使用反射来设置DependencyObject
字段,以及调用此隐藏方法来设置_contextParent
,但在一天结束时它不是一个干净的解决方案。 / p>
在搜索InheritenceContext
源代码后,我必须说我没有留下深刻的印象。 DependencyObject
可以而且应该是一个非常干净,无处不在,可重复使用的课程。
相反,它在结构和行为上与它的继承者绑定,甚至包含特定的常量,字段,方法和解决方法,以帮助Freezable与其他子类共存,这不仅偏离了良好的OO设计,而且在WPF框架之外,还使一个优秀的类完全无法使用。
答案 1 :(得分:0)
我假设您正在询问将值传播给不会自行覆盖值的子项。
据我所知,ContentControl
引入了一个有孩子的WPF元素的概念。这在层次结构中比你想要的更进一步。所以,我认为如果你只是从DependencyObject
推导出这种行为不会表现出来。
具体而言,孩子需要知道询问其父母是否没有给定财产的价值。
有趣的问题。我也想知道完整的答案。