Proprietà di dipendenza di sola letturaRead-Only Dependency Properties

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.This topic describes read-only dependency properties, including existing read-only dependency properties and the scenarios and techniques for creating a custom read-only dependency property.

PrerequisitesPrerequisites

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.This topic assumes that you understand the basic scenarios of implementing a dependency property, and how metadata is applied to a custom dependency property. Per il contesto, vedere Proprietà di dipendenza personalizzate e Metadati delle proprietà di dipendenza.See Custom Dependency Properties and Dependency Property Metadata for context.

Proprietà di dipendenza di sola lettura esistentiExisting Read-Only Dependency Properties

Alcune delle proprietà di dipendenza definite nel framework Windows Presentation Foundation (WPF)Windows Presentation Foundation (WPF) sono di sola lettura.Some of the dependency properties defined in the Windows Presentation Foundation (WPF)Windows Presentation Foundation (WPF) framework are read-only. 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.The typical reason for specifying a read-only dependency property is that these are properties that should be used for state determination, but where that state is influenced by a multitude of factors, but just setting the property to that state isn't desirable from a user interface design perspective. Ad esempio, IsMouseOver la proprietà è in realtà solo lo stato di superficie come determinato dall'input del mouse.For example, the property IsMouseOver is really just surfacing state as determined from the mouse input. Ogni tentativo di impostare questo valore a livello di codice aggirando il vero input del mouse sarebbe imprevedibile e potrebbe causare incongruenze.Any attempt to set this value programmatically by circumventing the true mouse input would be unpredictable and would cause inconsistency.

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à).By virtue of not being settable, read-only dependency properties aren't appropriate for many of the scenarios for which dependency properties normally offer a solution (namely: data binding, directly stylable to a value, validation, animation, inheritance). Nonostante non possano essere impostate, queste proprietà hanno in ogni caso alcune delle funzionalità aggiuntive supportate dalle proprietà di dipendenza nel sistema di proprietà.Despite not being settable, read-only dependency properties still have some of the additional capabilities supported by dependency properties in the property system. 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.The most important remaining capability is that the read-only dependency property can still be used as a property trigger in a style. Non è possibile abilitare i trigger con una normale proprietà DI Common Language Runtime (CLR); deve essere una proprietà di dipendenza.You can't enable triggers with a normal common language runtime (CLR) property; it needs to be a dependency property. La proprietà di IsMouseOver cui sopra è 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, primo piano o proprietà simili di elementi compositi all'interno del controllo, cambieranno quando l'utente posiziona il mouse su un'area definita del controllo.The aforementioned IsMouseOver property is a perfect example of a scenario where it might be quite useful to define a style for a control, where some visible property such as a background, foreground, or similar properties of composited elements within the control will change when the user places a mouse over some defined region of your control. 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à.Changes in a read-only dependency property can also be detected and reported by the property system's inherent invalidation processes, and this in fact supports the property trigger functionality internally.

Creazione di proprietà di dipendenza di sola lettura personalizzateCreating Custom Read-Only Dependency Properties

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.Make sure to read the section above regarding why read-only dependency properties won't work for many typical dependency-property scenarios. Se tuttavia si ha uno scenario adatto, è possibile creare una proprietà di dipendenza di sola lettura personalizzata.But if you have an appropriate scenario, you may wish to create your own read-only dependency property.

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.Much of the process of creating a read-only dependency property is the same as is described in the Custom Dependency Properties and Implement a Dependency Property topics. Vi sono tre differenze importanti:There are three important differences:

  • Quando si registra la RegisterReadOnly proprietà, chiamare Register il metodo anziché il metodo normale per la registrazione della proprietà.When registering your property, call the RegisterReadOnly method instead of the normal Register method for property registration.

  • Quando si implementa la proprietà "wrapper" CLR, assicurarsi che anche il wrapper non disponga di un'implementazione impostata, in modo che non vi sia alcuna incoerenza nello stato di sola lettura per il wrapper pubblico esposto.When implementing the CLR "wrapper" property, make sure that the wrapper too doesn't have a set implementation, so that there is no inconsistency in read-only state for the public wrapper you expose.

  • L'oggetto restituito dalla registrazione di DependencyPropertyKey sola DependencyPropertylettura è anziché .The object returned by the read-only registration is DependencyPropertyKey rather than DependencyProperty. Anche se è necessario archiviare il campo come membro, questo in genere non viene reso un membro pubblico del tipo.You should still store this field as a member but typically you would not make it a public member of the type.

Naturalmente, il valore o campo privato sottostante della proprietà di dipendenza di sola lettura può essere scritto usando qualsiasi logica.Whatever private field or value you have backing your read-only dependency property can of course be fully writable using whatever logic you decide. Tuttavia, il modo più semplice per impostare la proprietà inizialmente o come parte della logica di runtime consiste nell'utilizzare le API del sistema di proprietà, anziché aggirare il sistema di proprietà e impostare direttamente il campo di supporto privato.However, the most straightforward way to set the property either initially or as part of runtime logic is to use the property system's APIs, rather than circumventing the property system and setting the private backing field directly. In particolare, esiste una SetValue firma che accetta DependencyPropertyKeyun parametro di tipo .In particular, there is a signature of SetValue that accepts a parameter of type DependencyPropertyKey. Come e dove si imposta questo valore a livello di codice all'interno della logica dell'applicazione influirà su come si desidera impostare l'accesso su DependencyPropertyKey creato quando è stata registrata la proprietà di dipendenza per la prima volta.How and where you set this value programmatically within your application logic will affect how you may wish to set access on the DependencyPropertyKey created when you first registered the dependency property. 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.If you handle this logic all within the class you could make it private, or if you require it to be set from other portions of the assembly you might set it internal. Un approccio SetValue consiste nel chiamare all'interno di un gestore eventi di classe di un evento rilevante che informa un'istanza della classe che il valore della proprietà archiviata deve essere modificato.One approach is to call SetValue within a class event handler of a relevant event that informs a class instance that the stored property value needs to be changed. Un altro approccio consiste nel unire le PropertyChangedCallback CoerceValueCallback proprietà di dipendenza usando i callback e associati come parte dei metadati di tali proprietà durante la registrazione.Another approach is to tie dependency properties together by using paired PropertyChangedCallback and CoerceValueCallback callbacks as part of those properties' metadata during registration.

Poiché DependencyPropertyKey l'oggetto è privato e non viene propagato dal sistema di proprietà all'esterno del codice, una proprietà di dipendenza di sola lettura ha una maggiore sicurezza delle impostazioni rispetto a una proprietà di dipendenza di lettura/scrittura.Because the DependencyPropertyKey is private, and is not propagated by the property system outside of your code, a read-only dependency property does have better setting security than a read-write dependency property. 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.For a read-write dependency property, the identifying field is explicitly or implicitly public and thus the property is widely settable. Per informazioni più specifiche, vedere Sicurezza della proprietà di dipendenza.For more specifics, see Dependency Property Security.

Vedere ancheSee also