Настройка дерева наследования DependencyObject - PullRequest
8 голосов
/ 05 марта 2009

Я изо всех сил пытаюсь найти достаточно информации о свойстве Inheritance Tree (или Inheritence Context), используемом DependencyObject и DependencyProperty.

Я хотел бы использовать возможность наследования значений DependencyProperty вне типичной страницы WPF, так что Объект A является логическим родительским Объектом B, и, таким образом, значение, назначенное свойству в Объекте A, будет автоматически распространяться на Объект B, если он не был установлен локально (немного похоже на то, как свойство FlowDirection работает в WPF).

Если Объект A и Объект B получены из DependencyObject, и не являются дочерними элементами UIElement (другими словами, Объект A является собственным root ), тогда как установить логическое дерево, чтобы DependencyProperty понимало, что B является потомком A?

* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * '' * '' * ''], а '' Джоша Смита не совсем то, что я ищу Я не хочу получить свойства из существующего дерева элементов ... Я хочу создать свое собственное невизуальное дерево элементов ... т.е. иметь контроль над контекстом наследования.

Кто-нибудь знает, где скрывается эта совокупность знаний?

Ответы [ 2 ]

10 голосов
/ 06 марта 2009

После долгих исследований и поиска исходного кода для DependencyObject, вот краткий ответ:

InheritenceContext (свойство, которое выявляет логического родителя экземпляра) (например, 90% полезной реализации DependencyObject) помечено как внутреннее и, таким образом, скрыто от всего кода вне WindowsBase.dll

Можно использовать отражение для установки поля _contextParent, а также вызывать эти скрытые методы для установки InheritenceContext, но в конце дня это не чистое решение.

После изучения исходного кода DependencyObject я должен сказать, что я не впечатлен. DependencyObject мог и должен был быть очень чистым, вездесущим, пригодным для повторного использования классом. Вместо этого он структурно и поведенчески связан со своими наследниками и даже содержит определенные константы, поля, методы и обходные пути, чтобы помочь Freezable сосуществовать с остальными подклассами, что не только далеко отходит от хорошего дизайна ОО, но и также делает превосходный класс совершенно непригодным вне рамок WPF.

0 голосов
/ 05 марта 2009

Я предполагаю, что вы спрашиваете о распространении значений среди детей, которые сами не переопределяют значения.

Насколько я знаю, концепция элемента WPF, имеющего дочерний элемент, введена ContentControl. Это вступает в игру гораздо дальше по иерархии, чем вы хотите пойти. Итак, я бы предположил, что если бы вы просто выводили из DependencyObject, что это поведение не проявилось бы.

В частности, ребенок должен знать, чтобы спросить своего родителя, не имеет ли он значения для данного свойства.

Интересный вопрос. Я тоже хотел бы знать полный ответ.

...