我们有两个外部定义的、逻辑上独占(业务方面)的附加属性,它们都是可继承的。取决于哪个设置最接近我们正在阅读的 DependencyObject,这决定了我们在逻辑中使用哪个,如下所示。
注意:我不想知道它是继承的,你可以通过 来做DependencyPropertyHelper.GetValueSource
,我想知道从哪里开始,所以我可以确定优先级。
考虑以下可视树层次结构和附加属性:
Root // <-- AProp1 first set here
Child
GrandChild // <-- AProp2 first set here
GreatGrandChild // <-- AProp1 re-applied here
GreatGreatGrandChild
在 Root 的情况下,AProp1 是单独设置的,因此我们使用 AProp1。
在 Child 的情况下,AProp1 是继承的,因此我们仍然使用 AProp1。
在 GrandChild 的情况下,设置了 AProp2,但由于继承,AProp1 也具有值。然而,由于 AProp2 直接设置在此对象上(即距离“0”级别)与 AProp1(距离“2”),AProp2 优先于我们的业务逻辑。
在 GreatGrandChild 的情况下,同样由于 AProp1 已设置(距离“0”),优先于 AProp2(距离“1”)
最后,在 GreatGreatGrandChild 的情况下,AProp1 和 AProp2 都是通过继承获取的,但是由于 AProp1 在层次结构中设置得更近(距离“1”)与 AProp2(距离“2”)更近,所以 AProp1 是我们要使用的那个。
如果我能找到源头,我知道我可以简单地走链条并计算距离。我只需要来源。
笔记:
作为记录,是的,它们都可以设置在同一级别,在这种情况下 AProp2 将优先,但这与这个问题无关。
即使使用相同的值来提高其优先级,也可以重新应用属性(请参阅 GreatGrandChild) 。这就是为什么我需要知道源在哪里/离我正在检查的元素有多远。