Sicurezza delle proprietà di dipendenza

Le proprietà di dipendenza in genere devono essere considerate come 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 delle proprietà wrapper e di dipendenza

In genere, le proprietà di dipendenza vengono implementate insieme alle proprietà CLR (Common Language Runtime) di "wrapper" che semplificano l'acquisizione o l'impostazione della proprietà da un'istanza di . Tuttavia, i wrapper sono solo metodi pratici che implementano le chiamate sottostanti GetValue e SetValue statiche 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 sono paralleli al comportamento del sistema di proprietà e all'accesso della proprietà di dipendenza sottostante. L'inserimento di una richiesta di sicurezza sul wrapper impedirà solo l'utilizzo del metodo pratico, ma non impedirà le chiamate a GetValue o SetValue. Analogamente, inserendo un livello di accesso protetto o privato sui wrapper non viene garantita alcuna sicurezza effettiva.

Se si scrivono proprietà di dipendenza personalizzate, è necessario dichiarare i wrapper e il campo dell'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 a DependencyPropertyKey per tale proprietà. Per altre informazioni, vedere Proprietà di dipendenza di sola lettura.

Nota

Dichiarare un DependencyProperty campo identificatore 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 di proprietà di dipendenza del sistema di proprietà

In genere non è utile, e potenzialmente fuorviante, dichiarare un come DependencyProperty qualsiasi livello di accesso diverso da pubblico. L'impostazione di questo livello di accesso impedisce solo che qualcuno possa ottenere un riferimento all'istanza dalla classe dichiarante. Esistono tuttavia diversi aspetti del sistema di proprietà che restituiscono un DependencyProperty oggetto come mezzo per identificare una particolare proprietà come esiste in un'istanza di una classe o un'istanza di classe derivata e questo identificatore è ancora utilizzabile in una SetValue chiamata anche se l'identificatore statico originale viene dichiarato come non pubblico. Inoltre, OnPropertyChanged i metodi virtuali ricevono informazioni di qualsiasi proprietà di dipendenza esistente che ha modificato il valore. Inoltre, il GetLocalValueEnumerator metodo restituisce gli identificatori per qualsiasi proprietà nelle istanze con un valore impostato localmente.

Convalida e sicurezza

L'applicazione di una richiesta a un ValidateValueCallback oggetto e l'attesa dell'errore di convalida su un errore di richiesta per impedire che una proprietà venga impostata non è un meccanismo di sicurezza adeguato. L'invalidazione set-value applicata tramite ValidateValueCallback può anche essere eliminata dai chiamanti malintenzionati, se tali chiamanti operano all'interno del dominio dell'applicazione.

Vedi anche