我很难找到关于DependencyObject和DependencyProperty使用的属性继承树(或继承性上下文)的足够信息。
我想在一个典型的WPF页面之外使用DependencyProperty的值继承能力,例如对象A是逻辑父对象B,因此分配给对象A上的属性的值将自动与对象B相对应,除非它是本地设置的(有点像FlowDirection属性在WPF中工作)。
如果对象A和对象B是从DependencyObject派生出来的,并且不是UIElement的子对象(换句话说,对象A是它自己的根),那么如何建立逻辑树以使DependencyProperty理解B是A的子项?
Hillberg可冻诡计和乔希·史密斯的小把戏并不是我想要的。我不想从现有的元素树中检索属性.我想要创建我自己的非视觉元素树.即对继承上下文有控制权。
有人知道这个知识藏在哪里吗?
发布于 2009-03-06 08:12:51
在对DependencyObject的源代码进行了大量的研究和混淆之后,下面是一个简短的答案:
InheritenceContext (该属性显示实例的逻辑父级)被标记为内部(与DependencyObject有用实现的90%类似),因此对WindowsBase.dll以外的所有代码保持隐藏。
可以使用反射来设置_contextParent字段,也可以调用这个隐藏方法来设置InheritenceContext,但最终它并不是一个干净的解决方案。
在浏览了DependencyObject源代码之后,我不得不说,我对此并不感兴趣。DependencyObject可以而且应该是一个非常干净、无处不在、可重用的类。相反,它在结构和行为上绑定到它的继承者,甚至包含特定的常量、字段、方法和工作环境--以帮助其他子类与其他子类共存,这不仅偏离了良好的OO设计,而且使一个在WPF框架之外完全无法使用的优秀类完全不可用。
发布于 2009-03-05 13:28:58
我假设您是在询问将值传播到不覆盖值本身的子节点的问题。
据我所知,WPF元素有子元素的概念是由ContentControl引入的。这在层次结构中发挥的作用比你想要的要远得多。因此,我假设,如果您只是从DependencyObject中派生出这种行为,那么这种行为就不会显现出来。
具体来说,一个子属性需要知道是否它没有给定属性的值。
有趣的问题。我也想知道完整的答案。
https://stackoverflow.com/questions/614624
复制相似问题