2009-03-05 191 views
8

我很努力地找到有關DependencyObjectDependencyProperty所使用的屬性繼承樹(或繼承關係上下文)的足夠信息。自定義DependencyObject繼承樹

我想在典型的WPF頁面之外使用DependencyProperty的值繼承能力,例如對象A是邏輯父對象B,因此分配給對象A屬性的值將自動傳播到對象B除非它已經在本地設置(有點像WPF中的FlowDirection屬性)。

如果對象A和對象B從DependencyObject derieved,和是不是兒童UIElement(換句話說,對象A是它自己的),那麼你如何建立邏輯樹,以便DependencyProperty明白B是A的孩子?

Hillberg Freezable Trick以及Josh Smith's bag of tricks不是我所期待的。 I 不要想要從現有元素樹中檢索屬性...我想創建自己的非可視元素樹...即控制繼承上下文。

任何人都知道這個知識體在哪裏隱藏?

+1

我很好奇你是如何最終解決你的問題的。你編寫了自己的樹/繼承/ DP機制嗎?找到任何圖書館來幫助你的方式嗎?我試圖做類似的事情。 – 2009-09-03 02:14:58

回答

10

經過大量的研究,並通過DependencyObject源代碼得過且過,這裏的答案很簡單:

InheritenceContext(這揭示了一個實例的邏輯父屬性)是(像DependencyObject有用實施90% )標記爲內部的,從而從所有代碼保持隱藏WindowsBase.dll中的外

,能夠使用反射來設置_contextParent字段,以及調用這個隱藏方法來設置InheritenceContext,但在結束時這一天它不是一個乾淨的解決方案。

經過精練DependencyObject源代碼後,我得說我沒有留下深刻的印象。 DependencyObject可以而且應該是一個非常乾淨,無處不在,可重用的課程。 相反,它在結構上和行爲上都與它的繼承者綁定,甚至包含特定的常量,字段,方法和變通方法,以幫助Freezable與其他子類共存,這不僅遠離了良好的OO設計,但也使WPF框架之外完全無法使用的超類。

+1

歡呼聲回答這個有趣的問題。可惜這些屬性需要特定的基類,但我想不出更好的語言/編譯器支持的解決方案(與Freezable相同)。 – 2009-03-08 16:09:32

0

我假設你問的是值的傳播給不覆蓋值的孩子本身。

據我所知,有一個孩子的WPF元素的概念是由ContentControl引入的。這要比你想去的更進一步發揮作用。所以,我會假設,如果你只是從DependencyObject得出這種行爲不會表現出來。

具體來說,一個孩子需要知道詢問其父母,如果它沒有給定財產的價值。

有趣的問題。我想知道完整的答案。