Condividi tramite


Proprietà di Dipendenza Read-Only

In questo argomento vengono descritte 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

In questo argomento si presuppone che si comprendano gli scenari di base dell'implementazione di una proprietà di dipendenza e il modo in cui i metadati vengono applicati a una proprietà di dipendenza personalizzata. Per il contesto, vedere Proprietà di Dipendenza Personalizzate e i Metadati delle Proprietà di Dipendenza .

Proprietà di dipendenza Read-Only esistenti

Alcune delle proprietà di dipendenza definite nel framework Windows Presentation Foundation (WPF) sono di sola lettura. Il motivo tipico per specificare una proprietà di dipendenza di sola lettura è che si tratta di proprietà che devono essere usate per la determinazione dello stato, ma in cui tale stato è influenzato da una moltitudine di fattori, ma semplicemente impostando la proprietà su tale stato non è consigliabile dal punto di vista della progettazione dell'interfaccia utente. Ad esempio, la proprietà IsMouseOver è in realtà semplicemente in stato di visualizzazione come determinato dall'input del mouse. Qualsiasi tentativo di impostare questo valore a livello di codice aggirando l'input true del mouse sarebbe imprevedibile e causerebbe incoerenza.

Poiché non possono essere impostate, le proprietà di dipendenza di sola lettura non sono appropriate per molti degli scenari per i quali le proprietà di dipendenza offrono in genere una soluzione (ovvero: data binding, direttamente stilizzabili su un valore, validazione, animazione, ereditarietà). Nonostante non sia impostabile, le proprietà di dipendenza di sola lettura hanno ancora alcune delle funzionalità aggiuntive supportate dalle proprietà di dipendenza nel sistema di proprietà. La funzionalità rimanente più importante è che la proprietà di dipendenza di sola lettura può comunque 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à IsMouseOver precedente è un esempio perfetto di uno scenario in cui potrebbe essere molto utile definire uno stile per un controllo, in cui alcune proprietà visibili, ad esempio uno sfondo, in 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 apportate a una proprietà di dipendenza di sola lettura possono anche essere rilevate e segnalate dai processi intrinseci di invalidazione del sistema di proprietà, il che in effetti supporta internamente la funzionalità dei trigger di proprietà.

Creazione di proprietà di dipendenza personalizzate Read-Only

Assicurarsi di leggere la sezione precedente relativa al motivo per cui le proprietà di dipendenza di sola lettura non funzioneranno per molti scenari tipici di proprietà di dipendenza. Tuttavia, se si ha uno scenario appropriato, è possibile creare una proprietà di dipendenza di sola lettura personalizzata.

Gran parte del processo di creazione di una proprietà di dipendenza di sola lettura è uguale a quanto descritto negli argomenti Proprietà di dipendenza personalizzate e Implementare una proprietà di dipendenza. Esistono tre differenze importanti:

  • Quando si registra una proprietà, chiamare il metodo RegisterReadOnly invece del normale metodo 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. È comunque consigliabile archiviare questo campo come membro, ma in genere non lo si renderebbe un membro pubblico del tipo.

Qualsiasi campo privato o valore che supporta la tua proprietà di dipendenza di sola lettura può ovviamente essere completamente scrivibile utilizzando qualsiasi logica tu decida. 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, esiste una firma di SetValue che accetta un parametro di tipo DependencyPropertyKey. Come e dove imposti questo valore nel codice all'interno della logica dell'applicazione influirà sulla modalità in cui potresti voler impostare l'accesso nel DependencyPropertyKey creato al momento della registrazione della proprietà di dipendenza per la prima volta. Se si gestisce questa logica all'interno della classe, la si potrebbe rendere privata, o se è necessario impostarla da altre parti dell'assembly, la si potrebbe impostare 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à memorizzata necessita di essere cambiato. Un altro approccio consiste nell'associare tra loro le proprietà di dipendenza utilizzando i callback associati PropertyChangedCallback e CoerceValueCallback come parte dei metadati di tali proprietà durante la registrazione.

Poiché il DependencyPropertyKey è privato e non viene propagato dal sistema di proprietà all'esterno del tuo codice, una proprietà dipendente di sola lettura ha una migliore protezione delle impostazioni rispetto a una proprietà dipendente di lettura/scrittura. Per una proprietà di dipendenza di lettura/scrittura, il campo di identificazione è pubblico in modo esplicito o implicito e pertanto la proprietà è ampiamente impostabile. Per altre informazioni, vedere Sicurezza delle proprietà di dipendenza.

Vedere anche