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.
Prerequisiti
L'articolo presuppone una conoscenza di base delle proprietà di dipendenza e che tu 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 funzione di accesso public
. Ad esempio, il framework Windows Presentation Foundation (WPF) implementa la proprietà IsMouseOver di sola lettura perché il relativo valore deve essere determinato solo dall'input del mouse. Se IsMouseOver
consentisse altri input, il suo valore potrebbe diventare incoerente con l'input del mouse. Anche se non impostabile tramite una funzione di accesso public
, 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 attivatore di proprietà in uno stile. Ad esempio, IsMouseOver viene comunemente usato per attivare le modifiche apportate allo sfondo, al 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 abbia una funzione di accesso pubblica
set
.RegisterReadOnly
restituisce DependencyPropertyKey anziché DependencyProperty. Archiviare ilDependencyPropertyKey
in un membro della classe non pubblica.
È possibile determinare il valore della proprietà di dipendenza di sola lettura usando qualsiasi logica tu preferisca. Il modo consigliato per impostare il valore della proprietà, inizialmente o come parte della logica di runtime, consiste nell'usare l'overload di SetValue che accetta un parametro di tipo DependencyPropertyKey
. È preferibile utilizzare SetValue
piuttosto che 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 il DependencyPropertyKey
. Se si imposta solo il valore della proprietà dall'interno della classe che registra la proprietà di dipendenza, è possibile usare un modificatore di accesso private
. Per scenari in cui i valori delle proprietà di dipendenza si influenzano reciprocamente, è possibile utilizzare callback abbinate PropertyChangedCallback e CoerceValueCallback 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 modificatore di accesso internal
per l'DependencyPropertyKey
. Ad esempio, è possibile chiamare SetValue
da un gestore di eventi nello stesso assembly. Nell'esempio seguente viene definita una classe Aquarium che chiama RegisterReadOnly
per creare la proprietà di dipendenza di sola lettura FishCount
. Il DependencyPropertyKey
viene assegnato a un campo internal static readonly
, in modo che il codice nello stesso assembly possa modificare il valore della proprietà di dipendenza a 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 propaga il DependencyPropertyKey all'esterno del codice, le proprietà di dipendenza di sola lettura hanno una sicurezza di scrittura migliore rispetto alle proprietà di dipendenza di lettura/scrittura. Utilizzare una proprietà di dipendenza di sola lettura quando si desidera limitare l'accesso in scrittura a coloro che hanno un riferimento al 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.
Vedere anche
.NET Desktop feedback