Dela via


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. Lagra DependencyPropertyKey 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