Skrivskyddade beroendeegenskaper (WPF .NET)
Du kan använda skrivskyddade beroendeegenskaper för att förhindra att egenskapsvärden anges utanför din kod. I den här artikeln beskrivs befintliga skrivskyddade beroendeegenskaper samt scenarier och tekniker för att skapa en anpassad skrivskyddad beroendeegenskap.
Förutsättningar
Artikeln förutsätter grundläggande kunskaper om beroendeegenskaper och att du har läst Översikt över beroendeegenskaper. Om du vill följa exemplen i den här artikeln hjälper det om du är bekant med XAML (Extensible Application Markup Language) och vet hur du skriver WPF-program.
Befintliga skrivskyddade beroendeegenskaper
Skrivskyddade beroendeegenskaper rapporterar vanligtvis tillstånd och bör inte ändras via en public
-åtkomst. Ramverket för Windows Presentation Foundation (WPF) implementerar till exempel egenskapen IsMouseOver som skrivskyddad eftersom dess värde endast ska bestämmas av musens inmatning. Om IsMouseOver
tillåter andra indata kan dess värde bli inkonsekvent med musdata. Även om det inte går att ange via en public
-accessorfunktion, har många befintliga skrivskyddade beroendeegenskaper värden som bestäms av flera inmatningar.
Användningar av skrivskyddade beroendeegenskaper
Skrivskyddade beroendeegenskaper är inte tillämpliga i flera scenarier där beroendeegenskaper normalt erbjuder en lösning. Icke-tillämpliga scenarier inkluderar databindning, tillämpning av ett format på ett värde, validering, animering och arv. En skrivskyddad beroendeegenskap kan dock användas som egenskapstrigger i en stil. Till exempel används IsMouseOver ofta för att utlösa ändringar i bakgrunden, förgrunden eller annan synlig egenskap för en kontroll när musen är över den. WPF-egenskapssystemet identifierar och rapporterar ändringar i skrivskyddade beroendeegenskaper, vilket stöder funktioner för egenskapsutlösare. Skrivskyddade beroendeegenskaper är också användbara när du implementerar en beroendeegenskap av samlingstyp där endast samlingselementen måste vara skrivbara, inte själva samlingsobjektet. Mer information finns i beroendeegenskaper för samlingstyp.
NotE
Endast beroendeegenskaper, inte vanliga språkkörningsegenskaper, kan användas som egenskapsutlösare i ett format.
Skapa anpassade skrivskyddade beroendeegenskaper
Innan du skapar en beroendeegenskap som är skrivskyddad bör du kontrollera icke-tillämpliga scenarier.
Processen att skapa en skrivskyddad beroendeegenskap liknar på många sätt att skapa läs- och skrivbara beroendeegenskaper, med dessa skillnader:
När du registrerar din skrivskyddad egenskap anropar du RegisterReadOnly i stället för Register.
När du implementerar CLR-egenskapsomslutningen kontrollerar du att den inte har någon offentlig
set
-åtkomst.RegisterReadOnly
returnerar DependencyPropertyKey i stället för DependencyProperty. LagraDependencyPropertyKey
i en icke-offentlig klassmedlem.
Du kan fastställa värdet för den skrivskyddade beroendeegenskapen med vilken logik du än väljer. Det rekommenderade sättet att ange egenskapsvärdet, antingen initialt eller som en del av körlogik, är att använda överbelastningen av SetValue som tar en parameter av typen DependencyPropertyKey
. Att använda SetValue
är att föredra för att kringgå egenskapssystemet och ställa in bakgrundsfältet direkt.
Hur och var du anger värdet för en skrivskyddad beroendeegenskap i ditt program påverkar åtkomstnivån som du tilldelar till den klassmedlem som lagrar DependencyPropertyKey
. Om du bara anger egenskapsvärdet inifrån klassen som registrerar beroendeegenskapen kan du använda en private
åtkomstmodifierare. För scenarier där värdena för beroendeegenskaper påverkar varandra kan du använda kopplade PropertyChangedCallback och CoerceValueCallback återanrop för att utlösa värdeändringar. Mer information finns i beroendeegenskapsmetadata.
Om du behöver ändra värdet för en skrivskyddad beroendeegenskap utanför den klass som registrerar den kan du använda en internal
åtkomstmodifierare för DependencyPropertyKey
. Du kan till exempel anropa SetValue
från en händelsehanterare i samma sammansättning. I följande exempel definieras en akvariumklass som anropar RegisterReadOnly
för att skapa den skrivskyddade beroendeegenskapen FishCount
.
DependencyPropertyKey
tilldelas till ett internal static readonly
fält, så att koden i samma sammansättning kan ändra värdet för den skrivskyddade beroendeegenskapen.
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
Eftersom WPF-egenskapssystemet inte sprider DependencyPropertyKey utanför koden har skrivskyddade beroendeegenskaper bättre skrivsäkerhet än läs- och skrivbara beroendeegenskaper. Använd en skrivskyddad beroendeegenskap när du vill begränsa skrivåtkomsten till dem som har en referens till DependencyPropertyKey
.
Däremot är identifieraren för skriv-läsberoendeegenskapsidentifierare tillgänglig via egenskapssystemet, oavsett vilken åtkomstmodifierare du tilldelar den. Mer information finns i Dependency Property Security.
Se även
.NET Desktop feedback