Delen via


Alleen-lezen afhankelijke eigenschappen

U kunt alleen-lezen afhankelijkheidseigenschappen gebruiken om te voorkomen dat eigenschapswaarden buiten uw code worden ingesteld. In dit artikel worden bestaande eigenschappen van alleen-lezenafhankelijkheid en de scenario's en technieken voor het maken van een aangepaste alleen-lezen afhankelijkheidseigenschap besproken.

Vereiste voorwaarden

In het artikel wordt ervan uitgegaan dat u basiskennis hebt van afhankelijkheidseigenschappen en dat u overzicht van eigenschappen van afhankelijkheden hebt gelezen. Als u de voorbeelden in dit artikel wilt volgen, helpt dit als u bekend bent met Extensible Application Markup Language (XAML) en weet hoe u WPF-toepassingen schrijft.

Bestaande eigenschappen van alleen-lezenafhankelijkheid

Eigenschappen van alleen-lezenafhankelijkheid rapporteren doorgaans de status en moeten niet worden gewijzigd via een public accessor. Het Windows Presentation Foundation (WPF)-framework implementeert deze eigenschap als alleen-lezen, omdat de waarde ervan uitsluitend door muisinvoer moet worden bepaald. nl-NL: Als er andere invoer wordt toegestaan bij IsMouseOver, zou de waarde inconsistent kunnen worden met de invoer van de muis. Hoewel deze eigenschap niet kan worden ingesteld via een public accessor, hebben veel bestaande alleen-lezen afhankelijkheidseigenschappen waarden die worden bepaald door meerdere invoerbronnen.

Gebruik van alleen-lezen afhankelijkheidseigenschappen

Eigenschappen van alleen-lezenafhankelijkheid zijn niet van toepassing in verschillende scenario's waarbij afhankelijkheidseigenschappen normaal gesproken een oplossing bieden. Niet-toepasselijke scenario's omvatten gegevensbinding, het toepassen van een stijl op een waarde, validatie, animatie en overname. Een alleen-lezen afhankelijkheidseigenschap kan echter worden gebruikt als een trigger voor eigenschappen in een stijl. Wordt bijvoorbeeld IsMouseOver vaak gebruikt om wijzigingen in de achtergrond, voorgrond of andere zichtbare eigenschap van een besturingselement te activeren wanneer de muis erop staat. Het WPF-eigenschappensysteem detecteert en rapporteert wijzigingen in alleen-lezen afhankelijkheidseigenschappen, waardoor de functionaliteit van eigenschapstriggers wordt ondersteund. Alleen-lezen afhankelijkheidseigenschappen zijn ook handig bij het implementeren van een afhankelijkheidseigenschap van het type verzameling, als alleen de verzamelingselementen beschrijfbaar zijn en niet het verzamelingsobject zelf. Zie Verzamelingstype-afhankelijkheidseigenschappenvoor meer informatie.

Opmerking

Alleen eigenschappen van afhankelijkheden, niet reguliere eigenschappen van algemene taalruntime, kunnen worden gebruikt als eigenschapstriggers in een stijl.

Aangepaste alleen-lezen afhankelijke eigenschappen maken

Voordat u een afhankelijkheidseigenschap maakt die alleen lezen is, moet u de niet-toepasselijke scenario's controleren.

Het proces voor het maken van een alleen-lezen afhankelijkheidseigenschap is op veel manieren vergelijkbaar met het maken van eigenschappen voor lees-/schrijfafhankelijkheid, met deze verschillen:

  • Wanneer u uw alleen-lezen eigenschap registreert, gebruikt u RegisterReadOnly in plaats van Register.

  • Zorg er bij het implementeren van de CLR-eigenschap-wrapper voor dat deze geen openbare set accessor heeft.

  • RegisterReadOnly retourneert DependencyPropertyKey in plaats van DependencyProperty. Sla het DependencyPropertyKey op in een niet-openbaar klasselid.

U kunt de waarde van uw alleen-lezen afhankelijkheidseigenschap bepalen met de logica die u kiest. De aanbevolen manier om de eigenschapswaarde in te stellen, in eerste instantie of als onderdeel van runtimelogica, is om de overload van SetValue te gebruiken die een parameter van het type DependencyPropertyKey accepteert. Het gebruik SetValue verdient de voorkeur om het eigenschappensysteem te omzeilen en het backingveld rechtstreeks in te stellen.

Hoe en waar u de waarde van een alleen-lezen afhankelijkheidseigenschap in uw toepassing instelt, is van invloed op het toegangsniveau dat u toewijst aan het klasselid waarin de DependencyPropertyKeyeigenschap wordt opgeslagen. Als u alleen de eigenschapswaarde instelt vanuit de klasse die de afhankelijkheidseigenschap registreert, kunt u een private wijzigingsfunctie voor toegang gebruiken. Voor scenario's waarin de waarden van afhankelijkheidseigenschappen elkaar beïnvloeden, kunt u gekoppelde PropertyChangedCallback en CoerceValueCallback callbacks gebruiken om waardewijzigingen te activeren. Zie metagegevens van eigenschappen van afhankelijkhedenvoor meer informatie.

Als u de waarde van een alleen-lezen afhankelijkheidseigenschap wilt wijzigen van buiten de klasse die deze registreert, kunt u een internal toegangsmodifier voor de DependencyPropertyKey gebruiken. U kunt bijvoorbeeld SetValue aanroepen vanuit een gebeurtenishandler in dezelfde assembly. In het volgende voorbeeld wordt een Aquarium-klasse gedefinieerd die RegisterReadOnly aanroept om het alleen-lezen afhankelijkheidskenmerk te maken FishCount. De DependencyPropertyKey waarde is toegewezen aan een internal static readonly veld, zodat code in dezelfde assembly de alleen-lezen-afhankelijkheidseigenschapswaarde kan wijzigen.

public class Aquarium : DependencyObject
{
    // Register a dependency property with the specified property name,
    // property type, owner type, and property metadata.
    // Assign DependencyPropertyKey to a nonpublic field.
    internal static readonly DependencyPropertyKey FishCountPropertyKey =
        DependencyProperty.RegisterReadOnly(
          name: "FishCount",
          propertyType: typeof(int),
          ownerType: typeof(Aquarium),
          typeMetadata: new FrameworkPropertyMetadata());

    // Declare a public get accessor.
    public int FishCount =>
        (int)GetValue(FishCountPropertyKey.DependencyProperty);
}
Public Class Aquarium
    Inherits DependencyObject

    ' Register a dependency property with the specified property name,
    ' property type, owner type, And property metadata.
    ' Assign DependencyPropertyKey to a nonpublic field.
    Friend Shared ReadOnly FishCountPropertyKey As DependencyPropertyKey =
        DependencyProperty.RegisterReadOnly(
            name:="FishCount",
            propertyType:=GetType(Integer),
            ownerType:=GetType(Aquarium),
            typeMetadata:=New FrameworkPropertyMetadata())

    ' Declare a public get accessor.
    Public ReadOnly Property FishCount As Integer
        Get
            Return GetValue(FishCountPropertyKey.DependencyProperty)
        End Get
    End Property

End Class

Omdat het WPF-eigenschappensysteem de DependencyPropertyKey buiten uw code niet doorgeeft, hebben alleen-lezen-afhankelijkheidseigenschappen betere schrijfbeveiliging dan lezen/schrijven-afhankelijkheidseigenschappen. Gebruik een alleen-lezen afhankelijkheidseigenschap als u schrijftoegang wilt beperken tot degenen die een verwijzing naar de DependencyPropertyKeyeigenschap hebben.

De afhankelijkheidseigenschap-ID voor lees-schrijf afhankelijkheidseigenschappen is daarentegen toegankelijk via het eigenschappensysteem, ongeacht de toegangsmodificator die u eraan toewijst. Zie Beveiliging van afhankelijkheidseigenschappenvoor meer informatie.

Zie ook