Proprietà di dipendenza di sola lettura (WPF .NET)

È possibile usare le proprietà di dipendenza di sola lettura per impedire che i valori delle proprietà vengano impostati all'esterno del codice. Questo articolo illustra le proprietà di dipendenza di sola lettura esistenti e gli scenari e le tecniche per la creazione di una proprietà di dipendenza di sola lettura personalizzata.

Importante

La documentazione di Desktop Guide per .NET 7 e .NET 6 è in fase di costruzione.

Prerequisiti

L'articolo presuppone una conoscenza di base delle proprietà di dipendenza e che si abbia letto Panoramica delle proprietà di dipendenza. Per seguire gli esempi in questo articolo, è utile se si ha familiarità con Extensible Application Markup Language (XAML) e si sa come scrivere applicazioni WPF.

Proprietà di dipendenza di sola lettura esistenti

Le proprietà di dipendenza di sola lettura in genere segnalano lo stato e non devono essere modificabili tramite una public funzione di accesso. Ad esempio, il framework Windows Presentation Foundation (WPF) implementa la IsMouseOver proprietà come di sola lettura perché il relativo valore deve essere determinato solo dall'input del mouse. Se IsMouseOver sono consentiti altri input, il relativo valore potrebbe diventare incoerente con l'input del mouse. Anche se non impostabile tramite una public funzione di accesso, molte proprietà di dipendenza di sola lettura esistenti hanno valori determinati da più input.

Uso delle proprietà di dipendenza di sola lettura

Le proprietà di dipendenza di sola lettura non sono applicabili in diversi scenari in cui le proprietà di dipendenza in genere offrono una soluzione. Gli scenari non applicabili includono il data binding, l'applicazione di uno stile a un valore, la convalida, l'animazione e l'ereditarietà. Tuttavia, una proprietà di dipendenza di sola lettura può essere usata come trigger di proprietà in uno stile. Ad esempio, IsMouseOver viene comunemente usato per attivare le modifiche apportate allo sfondo, in primo piano o ad altre proprietà visibili di un controllo quando il mouse è posizionato su di esso. Il sistema di proprietà WPF rileva e segnala le modifiche apportate alle proprietà di dipendenza di sola lettura, supportando così la funzionalità di trigger delle proprietà. Le proprietà di dipendenza di sola lettura sono utili anche quando si implementa una proprietà di dipendenza di tipo raccolta in cui è necessario scrivere solo gli elementi della raccolta, non l'oggetto raccolta stesso. Per altre informazioni, vedere Proprietà di dipendenza di tipo raccolta.

Nota

Solo le proprietà di dipendenza, non le normali proprietà di Common Language Runtime, possono essere usate come trigger di proprietà in uno stile.

Creazione di proprietà di dipendenza di sola lettura personalizzate

Prima di creare una proprietà di dipendenza di sola lettura, controllare gli scenari non applicabili.

Il processo di creazione di una proprietà di dipendenza di sola lettura è in molti modi simile alla creazione di proprietà di dipendenza di lettura-scrittura, con queste distinzioni:

  • Quando si registra la proprietà di sola lettura, chiamare RegisterReadOnly anziché Register.

  • Quando si implementa il wrapper della proprietà CLR, assicurarsi che non disponga di una funzione di accesso pubblica set .

  • RegisterReadOnly restituisce DependencyPropertyKey anziché DependencyProperty. Archiviare l'oggetto DependencyPropertyKey in un membro della classe non pubblico.

È possibile determinare il valore della proprietà di dipendenza di sola lettura usando qualsiasi logica scelta. Il modo consigliato per impostare il valore della proprietà, inizialmente o come parte della logica di runtime, consiste nell'usare l'overload di che accetta un parametro di SetValue tipo DependencyPropertyKey. L'uso SetValue di è preferibile per aggirare il sistema di proprietà e impostare direttamente il campo sottostante.

Come e dove si imposta il valore di una proprietà di dipendenza di sola lettura all'interno dell'applicazione influirà sul livello di accesso assegnato al membro della classe che archivia .DependencyPropertyKey Se si imposta solo il valore della proprietà dall'interno della classe che registra la proprietà di dipendenza, è possibile usare un private modificatore di accesso. Per gli scenari in cui i valori delle proprietà di dipendenza influiscono l'uno sull'altro, è possibile usare callback e CoerceValueCallback associati PropertyChangedCallback per attivare le modifiche dei valori. Per altre informazioni, vedere Metadati delle proprietà di dipendenza.

Se è necessario modificare il valore di una proprietà di dipendenza di sola lettura dall'esterno della classe che la registra, è possibile usare un internal modificatore di accesso per .DependencyPropertyKey Ad esempio, è possibile chiamare SetValue da un gestore eventi nello stesso assembly. Nell'esempio seguente viene definita una classe Aquarium che chiama RegisterReadOnly per creare la proprietà FishCountdi dipendenza di sola lettura . L'oggetto DependencyPropertyKey viene assegnato a un internal static readonly campo, in modo che il codice nello stesso assembly possa modificare il valore della proprietà di dipendenza di sola lettura.

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

Poiché il sistema di proprietà WPF non viene propagato all'esterno del DependencyPropertyKey codice, le proprietà di dipendenza di sola lettura hanno una sicurezza di scrittura migliore rispetto alle proprietà di dipendenza di lettura-scrittura. Usare una proprietà di dipendenza di sola lettura quando si vuole limitare l'accesso in scrittura a coloro che dispongono di un riferimento a DependencyPropertyKey.

Al contrario, l'identificatore della proprietà di dipendenza per le proprietà di dipendenza di lettura/scrittura è accessibile tramite il sistema di proprietà, indipendentemente dal modificatore di accesso assegnato. Per altre informazioni, vedere Sicurezza delle proprietà di dipendenza.

Vedi anche