Delen via


Afhankelijkheidseigenschappen

Notitie

Deze inhoud wordt opnieuw afgedrukt door toestemming van Pearson Education, Inc. van Framework Design Guidelines: Conventions, Idioms en Patterns for Reusable .NET Libraries, 2nd Edition. Die editie werd in 2008 gepubliceerd en het boek is sindsdien volledig herzien in de derde editie. Sommige informatie op deze pagina is mogelijk verouderd.

Een afhankelijkheidseigenschap (DP) is een gewone eigenschap waarmee de waarde in een eigenschappenarchief wordt opgeslagen in plaats van deze op te slaan in een typevariabele (veld), bijvoorbeeld.

Een gekoppelde afhankelijkheidseigenschap is een soort afhankelijkheidseigenschap die is gemodelleerd als statische Get- en Set-methoden die 'eigenschappen' vertegenwoordigen die relaties tussen objecten en hun containers beschrijven (bijvoorbeeld de positie van een Button object in een Panel container).

✔️ Geef de afhankelijkheidseigenschappen op als u de eigenschappen nodig hebt om WPF-functies te ondersteunen, zoals stijl, triggers, gegevensbinding, animaties, dynamische resources en overname.

Ontwerp van afhankelijkheidseigenschap

✔️ DO overnemen van DependencyObject, of een van de subtypen, bij het implementeren van afhankelijkheidseigenschappen. Het type biedt een zeer efficiënte implementatie van een eigenschappenarchief en ondersteunt automatisch WPF-gegevensbinding.

✔️ DO biedt een reguliere CLR-eigenschap en een openbaar statisch alleen-lezenveld dat een exemplaar van System.Windows.DependencyProperty elke afhankelijkheidseigenschap opslaat.

✔️ Implementeer afhankelijkheidseigenschappen door instantiemethoden DependencyObject.GetValue aan te roepen en DependencyObject.SetValue.

✔️ Geef het statische veld van de afhankelijkheidseigenschap een naam door de naam van de eigenschap te achtervoegen met 'Eigenschap'.

❌ STEL GEEN standaardwaarden van afhankelijkheidseigenschappen expliciet in code in; stel ze in plaats daarvan in metagegevens in.

Als u een eigenschapsstandaard expliciet instelt, kunt u voorkomen dat die eigenschap wordt ingesteld op een aantal impliciete manieren, zoals een stijl.

❌ Plaats geen code in de eigenschapstoegangsors anders dan de standaardcode voor toegang tot het statische veld.

Deze code wordt niet uitgevoerd als de eigenschap is ingesteld op impliciete middelen, zoals een stijl, omdat de stijl het statische veld rechtstreeks gebruikt.

❌ GEBRUIK GEEN afhankelijkheidseigenschappen om beveiligde gegevens op te slaan. Zelfs eigenschappen van privéafhankelijkheid kunnen openbaar worden geopend.

Ontwerp van gekoppelde afhankelijkheidseigenschap

Afhankelijkheidseigenschappen die in de voorgaande sectie worden beschreven, vertegenwoordigen intrinsieke eigenschappen van het declaratietype; De eigenschap is bijvoorbeeld Text een eigenschap van TextButton, die deze declareert. Een speciaal soort afhankelijkheidseigenschap is de gekoppelde afhankelijkheidseigenschap.

Een klassiek voorbeeld van een gekoppelde eigenschap is de Grid.Column eigenschap. De eigenschap vertegenwoordigt de kolompositie van de knop (niet de kolompositie van het raster), maar is alleen relevant als de knop zich in een raster bevindt en dus 'gekoppeld' aan knoppen door rasters.

<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition />
        <ColumnDefinition />
    </Grid.ColumnDefinitions>

    <Button Grid.Column="0">Click</Button>
    <Button Grid.Column="1">Clack</Button>
</Grid>

De definitie van een gekoppelde eigenschap lijkt voornamelijk op die van een reguliere afhankelijkheidseigenschap, behalve dat de accessors worden vertegenwoordigd door statische Get- en Set-methoden:

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)
    );
}

Validatie van afhankelijkheidseigenschap

Eigenschappen implementeren vaak validatie. Validatielogica wordt uitgevoerd wanneer een poging wordt gedaan om de waarde van een eigenschap te wijzigen.

Helaas kunnen afhankelijkheidseigenschapstoegangsors geen willekeurige validatiecode bevatten. In plaats daarvan moet validatielogica voor afhankelijkheidseigenschappen worden opgegeven tijdens de registratie van eigenschappen.

❌ PLAATS geen validatielogica voor afhankelijkheidseigenschappen in de accessors van de eigenschap. Geef in plaats daarvan een callback voor validatie door aan DependencyProperty.Register de methode.

Meldingen over wijziging van afhankelijkheidseigenschappen

❌ Implementeer geen wijzigingsmeldingslogica in afhankelijkheidseigenschapstoegangsors. Afhankelijkheidseigenschappen hebben een ingebouwde functie voor wijzigingsmeldingen die moeten worden gebruikt door een callback voor wijzigingsmeldingen op te geven aan de PropertyMetadata.

Afhankelijkheidseigenschapswaarde coercion

Eigenschapscodering vindt plaats wanneer de waarde die aan een eigenschapssetter wordt gegeven, wordt gewijzigd door de setter voordat het eigenschappenarchief daadwerkelijk wordt gewijzigd.

❌ Implementeer geen logica voor coercion in afhankelijkheidseigenschapstoegangsors.

Afhankelijkheidseigenschappen hebben een ingebouwde functie voor coercion en kunnen worden gebruikt door een terugbeloproep naar de PropertyMetadataafhankelijkheid op te geven.

© Delen 2005, 2009 Microsoft Corporation. Alle rechten voorbehouden.

Herdrukt door toestemming van Pearson Education, Inc. van Framework Design Guidelines: Conventions, Idioms, and Patterns for Reusable .NET Libraries, 2nd Edition by Krzysztof Cwalina and Brad Abrams, published oct 22, 2008 by Addison-Wesley Professional als onderdeel van de Microsoft Windows Development Series.

Zie ook