Anpassen der DependencyObject-Vererbungsstruktur

8

Ich habe Mühe, genügend Informationen über die Eigenschaft Vererbungsbaum (oder Inheritance Context) zu finden, die von DependencyObject und DependencyProperty verwendet wird.

Ich möchte die Wertvererbungsfunktion von DependencyProperty außerhalb einer typischen WPF-Seite verwenden, so dass Objekt A das logische übergeordnete Objekt B ist und daher ein Wert, der einer Eigenschaft in Objekt A zugewiesen ist, automatisch an Object propagiert B, sofern es nicht lokal festgelegt wurde (ein bisschen wie die Eigenschaft FlowDirection in WPF).

Wenn Objekt A und Objekt B von DependencyObject entfernt werden und nicht untergeordneten Elemente von UIElement sind (mit anderen Worten, Objekt A ist sein eigenes Stamm ), wie stellen Sie dann den logischen Baum her, damit DependencyProperty versteht, dass B ein Kind von A ist?

Der Hillberg Freezable Trick sowie Josh Smiths Trickkiste ist nicht ganz das, wonach ich suche. Ich möchte keine Eigenschaften aus einer vorhandenen Elementstruktur abrufen ... Ich möchte meinen eigenen, nicht sichtbaren Elementbaum erstellen ... d. H., Sie haben die Kontrolle über den Erbkontext.

Weiß jemand, wo sich dieses Wissen versteckt?

    
Mark 05.03.2009, 12:46
quelle

2 Antworten

10

Nach viel Recherche und Durchwursteln des Quellcodes für DependencyObject , hier die kurze Antwort:

Das InheritenceContext (die Eigenschaft, die das logische Elternteil einer Instanz enthüllt) ist (wie 90% der nützlichen Implementierung von DependencyObject ) als intern markiert und somit vor allem Code außerhalb von WindowsBase.dll verborgen.

Es ist möglich, reflection zu verwenden, um das _contextParent -Feld zu setzen, und diese versteckten Methoden aufzurufen, um InheritenceContext zu setzen, aber am Ende des Tages ist es keine saubere Lösung.

Nachdem ich den DependencyObject Quellcode durchforstet habe, muss ich sagen, dass ich nicht beeindruckt bin. DependencyObject könnte und sollte eine sehr saubere, allgegenwärtige, wiederverwendbare Klasse sein. Stattdessen ist es strukturell und behaviorisch an seine Erben gebunden und enthält sogar spezifische Konstanten, Felder, Methoden und Workarounds, um Freezable bei der Koexistenz mit den anderen Unterklassen zu unterstützen, was nicht nur weit vom guten OO-Design entfernt ist, sondern auch macht auch eine ansonsten hervorragende Klasse außerhalb des WPF-Frameworks völlig unbrauchbar.

    
Mark 06.03.2009, 08:12
quelle
0

Ich nehme an, dass Sie nach der Weitergabe von Werten an Kinder fragen, die Werte nicht selbst überschreiben.

Das Konzept eines WPF-Elements mit einem Kind wird von ContentControl eingeführt, soweit ich weiß. Dies kommt viel weiter unten in der Hierarchie zum Einsatz, als Sie wollen. Ich würde also annehmen, dass wenn Sie einfach von DependencyObject ableiten würden, dass sich dieses Verhalten nicht manifestieren würde.

Insbesondere muss ein Kind wissen, ob es seinen Eltern fragen soll, wenn es für eine bestimmte Eigenschaft keinen Wert hat.

Interessante Frage. Ich würde gerne die vollständige Antwort auch wissen.

    
Drew Noakes 05.03.2009 13:28
quelle