Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
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 hetDependencyPropertyKey
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 DependencyPropertyKey
eigenschap 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 DependencyPropertyKey
eigenschap 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
.NET Desktop feedback