Sicurezza delle proprietà di dipendenza
Le proprietà di dipendenza devono in genere essere considerate proprietà pubbliche. La natura del sistema di proprietà Windows Presentation Foundation (WPF) impedisce la possibilità di garantire la sicurezza sul valore di una proprietà di dipendenza.
Accesso e sicurezza dei wrapper e delle proprietà di dipendenza
In genere, le proprietà di dipendenza vengono implementate insieme alle proprietà CLR (Common Language Runtime) "wrapper", che semplificano l'acquisizione o l'impostazione della proprietà da un'istanza. Tuttavia, i wrapper sono semplicemente metodi pratici che implementano le chiamate statiche sottostanti GetValue e SetValue usate durante l'interazione con le proprietà di dipendenza. Considerandolo in un altro modo, le proprietà vengono esposte come proprietà CLR (Common Language Runtime) supportate da una proprietà di dipendenza anziché da un campo privato. I meccanismi di sicurezza applicati ai wrapper non corrispondono al comportamento del sistema delle proprietà e all'accesso della proprietà di dipendenza sottostante. L'inserimento di una richiesta di sicurezza sul wrapper impedirà solo l'utilizzo del metodo di comodità, ma non impedirà chiamate a GetValue o SetValue. Analogamente, l'inserimento di un livello di accesso protetto o privato nei wrapper non garantisce alcuna sicurezza efficace.
Se si scrivono proprietà di dipendenza personalizzate, è necessario dichiarare i wrapper e il campo identificatore DependencyProperty come membri pubblici, in modo che i chiamanti non ottengano informazioni fuorvianti sul livello di accesso effettivo di tale proprietà (a causa del relativo archivio implementato come proprietà di dipendenza).
Per una proprietà di dipendenza personalizzata, è possibile registrare la proprietà come proprietà di dipendenza di sola lettura e ciò consente di impedire l'impostazione di una proprietà da parte di chiunque non contenga un riferimento al DependencyPropertyKey per tale proprietà. Per altre informazioni, vedere Read-Only Proprietà di dipendenza.
Nota
Dichiarare un campo identificatore DependencyProperty privato non è consentito e può essere usato per ridurre lo spazio dei nomi immediatamente esposto di una classe personalizzata, ma tale proprietà non deve essere considerata "privata" nello stesso senso delle definizioni del linguaggio CLR (Common Language Runtime) definiscono tale livello di accesso, per motivi descritti nella sezione successiva.
Esposizione del sistema delle proprietà di dipendenza
In genere non è utile e potenzialmente fuorviante dichiarare un DependencyProperty come qualsiasi livello di accesso diverso da pubblico. L'impostazione del livello di accesso impedisce solo a un utente di ottenere un riferimento all'istanza dalla classe dichiarante. Esistono tuttavia diversi aspetti del sistema di proprietà che restituiranno un DependencyProperty come mezzo per identificare una determinata proprietà come esiste in un'istanza di una classe o un'istanza di classe derivata e questo identificatore è ancora utilizzabile in una chiamata SetValue anche se l'identificatore statico originale viene dichiarato come non pubblico. Inoltre, i metodi virtuali OnPropertyChanged ricevono informazioni su qualsiasi proprietà di dipendenza esistente che abbia cambiato valore. Inoltre, il metodo GetLocalValueEnumerator restituisce gli identificatori per qualsiasi proprietà nelle istanze con un valore impostato localmente.
Convalida e sicurezza
L'applicazione di una richiesta a un ValidateValueCallback e l'attesa che il fallimento della convalida su un errore di richiesta impedisca l'impostazione di una proprietà non è un meccanismo di sicurezza adeguato. L'invalidazione del valore impostato applicata tramite ValidateValueCallback potrebbe anche essere eliminata dai chiamanti malintenzionati, se tali chiamanti operano all'interno del dominio dell'applicazione.
Vedere anche
.NET Desktop feedback