Abhängigkeitseigenschaften

Hinweis

Diese Inhalte wurden mit Genehmigung von Pearson Education, Inc. aus Framework Design Guidelines nachgedruckt: Conventions, Idioms, and Patterns for Reusable .NET Libraries, 2nd Edition. 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 (Dependency Property, DP) ist eine reguläre Eigenschaft, die ihren Wert in einem Eigenschaftsspeicher speichert, anstatt beispielsweise in einer Typvariablen (Feld).

Eine angefügte Abhängigkeitseigenschaft ist eine Art von Abhängigkeitseigenschaft, die als statische Get- und Set-Methoden modelliert ist, die „Eigenschaften“ darstellen, die Beziehungen zwischen Objekten und ihren Containern beschreiben (z. V. die Position eines Button-Objekts in einem Panel-Container).

✔️ STELLEN SIE die Abhängigkeitseigenschaften BEREIT, wenn Sie die Eigenschaften benötigen, um WPF-Funktionen wie Formatieren, Trigger, Datenbindungen, Animationen, dynamische Ressourcen und Vererbung zu unterstützen.

Entwurf der Abhängigkeitseigenschaft

✔️ Legen Sie für das Implementieren von Abhängigkeitseigenschaften das ERBEN von DependencyObject oder einem seiner Untertypen fest. Der Typ stellt eine sehr effiziente Implementierung eines Eigenschaftenspeichers bereit und unterstützt automatisch die WPF-Datenbindung.

✔️ STELLEN SIE eine reguläre CLR-Eigenschaft und ein öffentliches statisches schreibgeschütztes Feld BEREIT, das für jede Abhängigkeitseigenschaft eine Instanz von System.Windows.DependencyProperty speichert.

✔️ IMPLEMENTIEREN Sie Abhängigkeitseigenschaften durch Aufrufen der Instanzmethoden DependencyObject.GetValue und DependencyObject.SetValue.

✔️ BENENNEN Sie das statische Feld der Abhängigkeitseigenschaft, indem Sie den Namen der Eigenschaft mit dem Suffix „Property“ versehen.

❌ Legen Sie Standardwerte von Abhängigkeitseigenschaften NICHT explizit im Code fest, sondern stattdessen in den Metadaten.

Wenn Sie einen Standardwert für die Eigenschaft explizit festlegen, könnten Sie verhindern, dass diese Eigenschaft auf implizite Weise festgelegt wird, z. B. durch eine Formatierung.

❌ Fügen Sie KEINEN anderen Code als den Standardcode für den Zugriff auf das statische Feld in die Eigenschaftenzugriffsmethoden ein.

Dieser Code wird nicht ausgeführt, wenn die Eigenschaft implizit (z. B. durch eine Formatierung) festgelegt wird, da die Formatierung das statische Feld direkt verwendet.

❌ Verwenden Sie KEINE Abhängigkeitseigenschaften, um sichere Daten zu speichern. Auch auf private Abhängigkeitseigenschaften kann öffentlich zugegriffen werden.

Entwurf einer angefügten Abhängigkeitseigenschaft

Die im vorangehenden Abschnitt beschriebenen Abhängigkeitseigenschaften stellen intrinsische Eigenschaften deklarierenden Typs dar. Die Text-Eigenschaft ist z. B. eine Eigenschaft von TextButton, die diesen deklariert. Eine besondere Art der 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 (nicht des Rasters) dar, ist aber nur relevant, wenn die Schaltfläche in einem Raster enthalten ist, sodass sie Schaltflächen durch Raster „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 entspricht im Großen und Ganzen der einer regulären Abhängigkeitseigenschaft, mit dem Unterschied, dass die Zugriffsmethoden 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)
    );
}

Validierung von Abhängigkeitseigenschaften

Eigenschaften implementieren häufig, was als Validierung bezeichnet wird. Die Validierungslogik wird bei dem Versuch ausgeführt, den Wert einer Eigenschaft zu ändern.

Leider können Abhängigkeitseigenschaft-Zugriffsmethoden keinen beliebigen Validierungscode enthalten. Stattdessen muss die Validierungslogik für die Abhängigkeitseigenschaft bei der Eigenschaftenregistrierung angegeben werden.

❌ Fügen Sie die Validierungslogik für die Abhängigkeitseigenschaft NICHT in die Zugriffsmethoden der Eigenschaft ein. Übergeben Sie stattdessen einen Validierungsrückruf an die DependencyProperty.Register-Methode.

Benachrichtigungen über Änderungen der Abhängigkeitseigenschaft

❌ Implementieren Sie KEINE Änderungsbenachrichtigungslogik in Abhängigkeitseigenschaft-Zugriffsmethoden. Abhängigkeitseigenschaften verfügen über eine integrierte Änderungsbenachrichtigungsfunktion, zu deren Verwendung ein Änderungsbenachrichtigungs-Rückruf an die PropertyMetadata gerichtet werden muss.

Koersion von Abhängigkeitseigenschaftswerten

Die Eigenschaftskoersion erfolgt, wenn der Wert, der einem Setter für eine Eigenschaft übergeben wird, vom Setter geändert wird, bevor der Eigenschaftenspeicher tatsächlich geändert wird.

❌ Implementieren Sie KEINE Koersionslogik in Abhängigkeitseigenschaft-Zugriffsmethoden.

Abhängigkeitseigenschaften verfügen über eine integrierte Koersionsfunktion, zu deren Verwendung ein Koersionsrückruf an die PropertyMetadata gerichtet 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, 2nd Edition von Krzysztof Cwalina und Brad Abrams, veröffentlicht am 22. Oktober 2008 durch Addison-Wesley Professional als Teil der Microsoft Windows Development Series.

Weitere Informationen