WPF und Dependency Properties

Dey

Banned
Registriert
Mai 2005
Beiträge
1.925
Hey.

Rein aus Neugier interessiere ich mich dafür, wie Dependency Properties als ein Grundkonzept der WPF in dieser implementiert sind, d.h. wie sie programmiertechnisch implementiert sind.

Es ist ja höchst interessant, dass Eigenschaften definiert werden können, die auf jeder beliebigen Klasse gesetzt werden kann.

Werden die in DependencyObject registrierten Properties in dieser Klasse dynamisch gebunden, sodass sie auch anderen Objekten, die aus der Klasse abgeleitet werden, direkt zur Verfügung stehen?
 
Dey schrieb:
Rein aus Neugier interessiere ich mich dafür, wie Dependency Properties als ein Grundkonzept der WPF in dieser implementiert sind, d.h. wie sie programmiertechnisch implementiert sind.

Siehe Angang. Viel Spaß beim lesen.
Um dir ein paar 1000 Zeilen zu sparen, im Prinzip ein Hashtable.

Dey schrieb:
Werden die in DependencyObject registrierten Properties in dieser Klasse dynamisch gebunden, sodass sie auch anderen Objekten, die aus der Klasse abgeleitet werden, direkt zur Verfügung stehen?

Ja.
 

Anhänge

hehe... Hammer! Danke...

dass es vereinfacht ausgedrückt eine Hasttable ist, ist mir klar. Die DependencyProperty ist schließlich nicht mehr als ein Key.

Was ich höchst interessant finde und mir wie ein Mysterium erscheint, ist die Tatsache, dass eine im Code registrierte DependencyProperty bereits vor dem Kompilieren überall zur Verfügung steht. D.h. sobald ich die Zeile Code niedergeschrieben habe, in der die DependencyProperty zur Laufzeit registriert wird, steht sie mir überall zur Verfügung. Wie kann das sein?

Das impliziert eigentlich, dass es noch mehr sein muss als nur zur Laufzeit gebundene Properties. Möglicherweise ist das fest in die WPF programmiert.
 
Dey schrieb:
Was ich höchst interessant finde und mir wie ein Mysterium erscheint, ist die Tatsache, dass eine im Code registrierte DependencyProperty bereits vor dem Kompilieren überall zur Verfügung steht.
Wie genau meinst du das? Sprichst du von der Auto-Vervollständigung der IDE? Verwechselst du das vielleicht mit dem Zugriff auf "normale" Properties?

Dey schrieb:
D.h. sobald ich die Zeile Code niedergeschrieben habe, in der die DependencyProperty zur Laufzeit registriert wird, steht sie mir überall zur Verfügung. Wie kann das sein?
Eine DependencyProperty wird nicht so genutzt, wie eine normale Property. Du benutzt für ersteres, wie du schon gemerkt hast, einen Schlüssel. Den gibst du bei der Deklarierung und bei der Benutzung an. Zur Laufzeit wird dann nachgeschaut, ob es zu dem angegebenen Schlüssel auch tatsächlich ein Wert gibt. Wenn du dich dabei vertippst bekommst du eine Fehlermeldung oder, wahrscheinlicher, es "funktioniert einfach nicht".
 
Ich meine folgendes (am Beispiel eines Attached Events, welches letztlich genauso wie eine DependencyProperty behandelt wird):

PHP:
  class Exit:ICommand
    {
        public static readonly RoutedEvent ExecuteEvent= EventManager.RegisterRoutedEvent("Execute", RoutingStrategy.Bubble, typeof(RoutedEventHandler, typeof(Exit));
 
 
    }

Sobald ich den oben stehenden Code eingetippt habe, kennt die IDE mein RoutedEvent und bietet es in IntelliSense an:

PHP:
 class MainWindow : Window {
        
        public MainWindow() {
        this.AddHandler(Exit.ExecuteEvent, new RoutedEventHandler(this.OnExecute));
        }
 
        public void OnExecute(object sender, RoutedEventArgs e) {
            ;
        }
    }

Das kann ich nicht ganz nachvollziehen. Wenn das RoutedEvent bzw. die DependencyProperty erst zur Laufzeit dynamisch gebunden würde, sollte sie auch erst dann zur Verfügung stehen. Da sie aber bereits vor der Laufzeit zur Verfügung steht, habe ich die Vermutung, dass die IDE die Klasse DependencyObject im Hintergrund neu kompiliert.

Und zwar immer dann, sobald ich die Register-Methode aufrufe. Meine Vermutung sieht so aus:

Ich gebe eine Befehlszeile mit der Register-Methode ein, die IDE erstellt im Hintergrund ein "Kompilat" der Klasse, in der die Attached Properties/Events fest im Code codiert sind, und ich kann unmittelbar darauf von überall auf die Properties zugreifen, da sie jetzt der IDE bekannt sind.

Das wäre natürlich eine sehr unelegante Lösung und daher glaube ich eigentlich, dass es anders umgesetzt sein muss.
 
Das, was du als Beispiel angegeben hast, hat nichts mit Attached/Dependecy Properties im speziellen zu tun. Du deklariert in der Klasse Exit ein Feld "ExecuteEvent". Dies ist ein fester Bestandteil der Klasse und kann somit von der Autovervollständigung angeboten werden. Was für einen Wert du ExecuteEvent zuweist oder wann dies passiert, spielt keine Rolle.

Du kannst auch public static readonly String MyString deklarieren und würdest dies ebenso in der Autovervollständigung sehen können. Gleiches gilt für die Funktion AddHandler() der Window-Klasse.
 
Stimmt. Das hat eigentlich gar nix damit zu tun :D
 
Zurück
Oben