Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Hinweis
Dieser Inhalt wird mit Genehmigung von Pearson Education, Inc. aus Framework Design Guidelines: Konventionen, Idiome und Muster für wiederverwendbare .NET-Bibliotheken, 2. Auflage nachgedruckt. Diese Ausgabe wurde 2008 veröffentlicht, und das Buch wurde seitdem in der dritten Ausgabe vollständig überarbeitet. Einige der Informationen auf dieser Seite sind möglicherweise veraltet.
Eine Abhängigkeitseigenschaft (DP) ist eine normale Eigenschaft, die ihren Wert in einem Eigenschaftenspeicher speichert, anstatt ihn in einer Typvariable (Feld) zu speichern.
Eine angefügte Abhängigkeitseigenschaft ist eine Art von Abhängigkeitseigenschaft, die als statische Get- und Set-Methoden modelliert wird, die "Eigenschaften" darstellen, die Beziehungen zwischen Objekten und ihren Containern beschreiben (z. B. die Position eines Button
Objekts in einem Panel
Container).
✔️ Do stellt die Abhängigkeitseigenschaften bereit, wenn Sie die Eigenschaften benötigen, um WPF-Features wie Formatieren, Trigger, Datenbindung, Animationen, dynamische Ressourcen und Vererbung zu unterstützen.
Design der Abhängigkeitseigenschaft
✔️ DO erbt von DependencyObjectoder einem seiner Untertypen, wenn Abhängigkeitseigenschaften implementiert werden. Der Typ bietet eine sehr effiziente Implementierung eines Eigenschaftenspeichers und unterstützt automatisch die WPF-Datenbindung.
✔️ DO stellen eine normale CLR-Eigenschaft und ein öffentliches statisches schreibgeschütztes Feld bereit, die eine Instanz von System.Windows.DependencyProperty für jede Abhängigkeitseigenschaft speichern.
✔️ DO implementieren Abhängigkeitseigenschaften durch Aufrufen von Instanzmethoden DependencyObject.GetValue und DependencyObject.SetValue.
✔️ GEBEN Sie dem statischen Feld der Abhängigkeitseigenschaft einen Namen, indem Sie den Namen der Eigenschaft mit "Property" suffixieren.
❌ LEGEN SIE KEINE Standardwerte von Abhängigkeitseigenschaften explizit im Code fest; legen Sie sie stattdessen in Metadaten fest.
Wenn Sie eine Standardeigenschaft explizit festlegen, können Sie verhindern, dass diese Eigenschaft durch eine implizite Methode, wie eine Stilvorlage, festgelegt wird.
❌ Fügen Sie keinen Code in die Eigenschaftszugriffe ein, außer den Standardcode, um auf das statische Feld zuzugreifen.
Der Code wird nicht ausgeführt, wenn die Eigenschaft auf implizite Weise festgelegt wird, wie durch eine Stilsetzung, da bei einer Stilsetzung das statische Feld direkt genutzt wird.
❌ VERWENDEN SIE KEINE Abhängigkeitseigenschaften, um sichere Daten zu speichern. Auch auf private Abhängigkeitseigenschaften kann öffentlich zugegriffen werden.
Design von angefügten Abhängigkeitseigenschaften
Abhängigkeitseigenschaften, die im vorherigen Abschnitt beschrieben werden, stellen systeminterne Eigenschaften des deklarierenden Typs dar; die Eigenschaft Text
ist beispielsweise eine Eigenschaft von TextButton
, welche sie deklariert. Eine spezielle Art von Abhängigkeitseigenschaft ist die angefügte Abhängigkeitseigenschaft.
Ein klassisches Beispiel für eine angefügte Eigenschaft ist die Grid.Column Eigenschaft. Die Eigenschaft stellt die Spaltenposition der Schaltfläche dar (nicht die des Rasters), ist aber nur relevant, wenn die Schaltfläche in einem Raster enthalten ist und daher von Rastern an Schaltflächen angefügt wird.
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition />
<ColumnDefinition />
</Grid.ColumnDefinitions>
<Button Grid.Column="0">Click</Button>
<Button Grid.Column="1">Clack</Button>
</Grid>
Die Definition einer angefügten Eigenschaft sieht hauptsächlich wie die einer regulären Abhängigkeitseigenschaft aus, mit der Ausnahme, dass die Accessoren durch statische Get- und Set-Methoden dargestellt werden:
public class Grid {
public static int GetColumn(DependencyObject obj) {
return (int)obj.GetValue(ColumnProperty);
}
public static void SetColumn(DependencyObject obj, int value) {
obj.SetValue(ColumnProperty,value);
}
public static readonly DependencyProperty ColumnProperty =
DependencyProperty.RegisterAttached(
"Column",
typeof(int),
typeof(Grid)
);
}
Überprüfung der Abhängigkeitseigenschaft
Eigenschaften implementieren häufig die sogenannte Überprüfung. Die Überprüfungslogik wird ausgeführt, wenn versucht wird, den Wert einer Eigenschaft zu ändern.
Leider können Abhängigkeitseigenschaftsaccessoren keinen beliebigen Überprüfungscode enthalten. Stattdessen muss die Logik der Abhängigkeitseigenschaftsüberprüfung während der Eigenschaftsregistrierung angegeben werden.
❌ Platzieren Sie keine Validierungslogik für Abhängigkeitseigenschaften in den Zugriffsmodifikatoren der Eigenschaft. Übergeben Sie stattdessen einen Überprüfungsrückruf an die DependencyProperty.Register
Methode.
Änderungsbenachrichtigungen für Abhängigkeitseigenschaften
❌ Implementieren Sie KEINE Änderungsbenachrichtigungslogik in Zugriffsors von Abhängigkeitseigenschaften. Abhängigkeitseigenschaften verfügen über eine integrierte Funktion für Änderungsbenachrichtigungen, die verwendet werden muss, indem ein Änderungsbenachrichtigungs-Rückruf an die PropertyMetadata übergeben wird.
Erzwungene Wertänderung bei Abhängigkeitseigenschaften
Der Eigenschaftszwang wird ausgeführt, wenn der Wert, der einem Eigenschaften-Setter zugewiesen wird, vom Setter geändert wird, bevor der Eigenschaftsspeicher tatsächlich geändert wird.
❌ Implementieren Sie KEINE Zwangslogik in den Zugriffsmethoden für Abhängigkeitseigenschaften.
Abhängigkeitseigenschaften verfügen über eine eingebaute Zwangsfunktion, die genutzt werden kann, indem ein Zwangsrückruf für PropertyMetadata
bereitgestellt wird.
© Teile 2005, 2009 Microsoft Corporation. Alle Rechte vorbehalten.
Nachdruck mit Genehmigung von Pearson Education, Inc. aus Framework Design Guidelines: Conventions, Idioms, and Patterns for Reusable .NET Libraries, 2. Auflage von Krzysztof Cwalina und Brad Abrams, veröffentlicht am 22. Okt 2008 von Addison-Wesley Professional als Teil der Microsoft Windows Development Series.