Proprietà di dipendenza di sola lettura

Questo argomento descrive le proprietà di dipendenza di sola lettura, incluse 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

Nell'argomento si presuppone la conoscenza degli scenari di base dell'implementazione di una proprietà di dipendenza e del modo in cui i metadati vengono applicati a una proprietà di dipendenza personalizzata. Per il contesto, vedere Proprietà di dipendenza personalizzate e Metadati delle proprietà di dipendenza.

Proprietà di dipendenza di sola lettura esistenti

Alcune delle proprietà di dipendenza definite nel framework Windows Presentation Foundation (WPF) sono di sola lettura. La ragione più comune per specificare una proprietà di dipendenza di sola lettura è che si tratta di proprietà che devono essere usate per la determinazione dello stato. Se però lo stato è influenzato da una molteplicità di fattori, la semplice impostazione della proprietà su quello stato non rappresenta la soluzione appropriata nell'ottica della progettazione di un'interfaccia utente. Ad esempio, la proprietà IsMouseOver è in realtà semplicemente in stato di visualizzazione come determinato dall'input del mouse. Ogni tentativo di impostare questo valore a livello di codice aggirando il vero input del mouse sarebbe imprevedibile e potrebbe causare incongruenze.

Dal momento che non possono essere impostate, le proprietà di dipendenza di sola lettura non sono appropriate per molti degli scenari in cui in genere offrono una soluzione (vale a dire: data binding, possibilità di applicare direttamente uno stile a un valore, convalida, animazione, ereditarietà). Nonostante non possano essere impostate, queste proprietà hanno in ogni caso alcune delle funzionalità aggiuntive supportate dalle proprietà di dipendenza nel sistema di proprietà. La funzionalità più importante consiste nel fatto che la proprietà di dipendenza di sola lettura può essere usata come trigger di proprietà in uno stile. Non è possibile abilitare i trigger con una normale proprietà CLR (Common Language Runtime); deve essere una proprietà di dipendenza. La proprietà indicata in precedenza IsMouseOver è un esempio perfetto di uno scenario in cui potrebbe essere utile definire uno stile per un controllo, in cui alcune proprietà visibili, ad esempio uno sfondo, un primo piano o proprietà simili di elementi compositi all'interno del controllo cambieranno quando l'utente posiziona un mouse su un'area definita del controllo. Le modifiche a una proprietà di dipendenza di sola lettura possono anche essere rilevate e segnalate dai processi di invalidamento inerenti del sistema di proprietà, che infatti è dotato del supporto interno della funzionalità del trigger di proprietà.

Creazione di proprietà di dipendenza di sola lettura personalizzate

Assicurarsi di leggere la sezione precedente sui motivi per cui le proprietà di dipendenza di sola lettura non funzionano per molti scenari comuni di proprietà di dipendenza. Se tuttavia si ha uno scenario adatto, è possibile creare una proprietà di dipendenza di sola lettura personalizzata.

Gran parte del processo di creazione di una proprietà di dipendenza di sola lettura è identico a quello descritto negli argomenti Proprietà di dipendenza personalizzate e Implementare una proprietà di dipendenza. Vi sono tre differenze importanti:

  • Quando si registra la proprietà, chiamare il RegisterReadOnly metodo anziché il metodo normale Register per la registrazione delle proprietà.

  • Quando si implementa la proprietà "wrapper" CLR, assicurarsi che anche il wrapper non abbia un'implementazione impostata, in modo che non vi sia incoerenza nello stato di sola lettura per il wrapper pubblico esposto.

  • L'oggetto restituito dalla registrazione di sola lettura è DependencyPropertyKey anziché DependencyProperty. Anche se è necessario archiviare il campo come membro, questo in genere non viene reso un membro pubblico del tipo.

Naturalmente, il valore o campo privato sottostante della proprietà di dipendenza di sola lettura può essere scritto usando qualsiasi logica. Tuttavia, il modo più semplice per impostare la proprietà inizialmente o come parte della logica di runtime consiste nell'usare le API del sistema di proprietà, anziché aggirare il sistema di proprietà e impostare direttamente il campo sottostante privato. In particolare, è presente una firma di SetValue che accetta un parametro di tipo DependencyPropertyKey. Come e dove si imposta questo valore a livello di codice all'interno della logica dell'applicazione influirà su come impostare l'accesso all'oggetto DependencyPropertyKey creato al momento della registrazione della proprietà di dipendenza per la prima volta. Se si gestisce tutta questa logica all'interno della classe è possibile renderla privata o, se è necessario impostarla da un'altra porzione dell'assembly, è possibile impostarla come interna. Un approccio consiste nel chiamare SetValue all'interno di un gestore eventi di classe di un evento pertinente che informa un'istanza della classe che il valore della proprietà archiviata deve essere modificato. Un altro approccio consiste nell'associare le proprietà di dipendenza usando callback e CoerceValueCallback associati PropertyChangedCallback come parte dei metadati di tali proprietà durante la registrazione.

DependencyPropertyKey Poiché è privato e non viene propagato dal sistema di proprietà all'esterno del codice, una proprietà di dipendenza di sola lettura ha una migliore sicurezza delle impostazioni rispetto a una proprietà di dipendenza di lettura/scrittura. Per una proprietà di dipendenza di lettura e scrittura, il campo di identificazione è pubblico in modo esplicito oppure implicito, per cui la proprietà può essere impostata senza alcuna limitazione. Per informazioni più specifiche, vedere Sicurezza della proprietà di dipendenza.

Vedi anche