Was ist eine Abhängigkeitseigenschaft?

Antworten:

94

Abhängigkeitseigenschaften sind Eigenschaften von Klassen, die von DependencyObject abgeleitet sind, und sie sind insofern besonders, als sie nicht nur ein Hintergrundfeld zum Speichern ihres Werts verwenden, sondern einige Hilfsmethoden für DependencyObject verwenden.

Das Schönste an ihnen ist, dass sie alle Installationen für die Datenbindung eingebaut haben. Wenn Sie etwas an sie binden, werden sie es benachrichtigen, wenn sie sich ändern.

Matt Hamilton
quelle
36
Das sagt mir immer noch sehr wenig darüber aus, was eine Abhängigkeitseigenschaft tun kann oder warum sie existiert. Sie erwähnen nichts von ihrer wertvollsten Eigenschaft, der Wertauflösung im Elementbaum.
ProfK
hi @MattHamilton, danke für deine Antwort - aber was meinst du mit "sie verwenden einige Hilfsmethoden für DependencyObject"?
BKSpurgeon
2
@BKSpurgeon DependencyObject verfügt über einige Methoden wie "SetValue" und "GetValue", die Sie aufrufen, um den Wert einer Abhängigkeitseigenschaft zu speichern / lesen, anstatt ein Hintergrundfeld zu verwenden.
Matt Hamilton
91

Die einzige Erklärung, die ich hilfreich und gut geschrieben fand, ist diese: http://www.wpftutorial.net/dependencyproperties.html

Grundsätzlich unterscheiden sich DependencyProperties von regulären Eigenschaften darin, dass sie nicht nur Setter / Getter für Felder in der Klasse sind, sondern ihre tatsächlichen Werte zur Laufzeit dynamisch abrufen. Die SetValue()Methode von DPs ist ziemlich einfach und setzt den lokalen Wert der Eigenschaft auf den Wert, den Sie ihr gegeben haben. Wenn Sie jedoch versuchen, GetValue()von einer DependencyProperty aus einen lokalen Wert zu ermitteln, wird zunächst nach einem lokalen Wert gesucht. Wenn keiner vorhanden ist (was in DependencyProperties im Gegensatz zu regulären Eigenschaften möglich ist), wird der logische UI-Baum fortgesetzt, bis ein solcher Wert gefunden wird. Wenn das Framework den oberen Rand des Baums erreicht hat, ohne lokale Werte zu finden, wird ein vordefinierter Standardwert als Wert für die Eigenschaft verwendet.

Mit dieser Methode kann DependencyProperties weniger Speicher als reguläre Eigenschaften belegen, da nur Werte gespeichert werden, die vom Benutzer explizit festgelegt wurden.

Wie oben erwähnt, können wir mit DependencyProperties auch im XAML-Code an sie binden und Trigger für sie festlegen, was bei regulären Eigenschaften nicht zulässig ist.

Ich hoffe, ich habe es geschafft, etwas von der Unbestimmtheit zu beseitigen :)

Jonathan Perry
quelle
2
Und was ist ein "Attached Property"?
Paul-Sebastian Manole
12
Eine angehängte Eigenschaft ist eine Eigenschaft, die nicht zum aktuellen Element gehört, das deklariert wird, sondern ein anderes Objekt betrifft. Beispiel: Bei Grid.Row="1"a Buttonwird festgelegt, dass es sich in Zeile 2 des übergeordneten Elements befindet Grid(aufgrund der Tatsache, dass Zeilen auf Null basieren), aber die RowDependencyProperty gehört zum GridObjekt.
Jonathan Perry
2
Meinten Sie damit DependencyProperties also allow us to bind to them in the XAML code and set triggers on them, which on regular properties is not allowed, dass sowohl das Binden in XAML als auch das Setzen von Triggern oder das Setzen von Triggern nicht zulässig ist? Vielen Dank für das Follow-up und die Hilfe, um die Dinge klarer zu machen!
Paul-Sebastian Manole
@ Paul-SebastianManole DataTrigger arbeiten auch mit regulären Eigenschaften. Angenommen, Sie haben eine ValueEigenschaft (nicht DP) mit dem Wert 0 , und Sie möchten Ihre Ansicht , etwas zu tun , wenn ValueÄnderungen 1. hast du die Möglichkeit, dies zu tun mit DataTriggerund Einstellung derBinding={Binding Path=Value, Value=1}
Jonathan Perry
36

http://techpunch.wordpress.com/2008/09/25/wpf-wf-what-is-a-dependency-property/ bietet eine gute Erklärung der Abhängigkeitseigenschaften sowohl im Kontext von WF als auch von WPF.

Ein Ausschnitt:

Schlüsselpunkt - Der Wert der Abhängigkeitseigenschaften wird aufgelöst

Das ultimative Ziel einer Abhängigkeitseigenschaft ist, wie bei jeder Eigenschaft, die Verwaltung des Status. Im Gegensatz zu normalen .Net-Eigenschaften wird der lokale Eigenschaftswert jedoch nicht in einer Instanzvariablen gespeichert.

Stattdessen werden Abhängigkeitseigenschaften im Rahmen der Abhängigkeitseigenschaften registriert und der zugrunde liegende Eigenschaftswert wird aufgelöst. Dies bedeutet, dass der Wert vom Rahmen der Abhängigkeitseigenschaften basierend auf den durch die Eigenschaftsregistrierung definierten Regeln bestimmt wird.

Ash M.
quelle