ICustomTypeDescriptor, TypeDescriptionProvider, TypeConverter e UITypeEditor
-
09-09-2019 - |
Domanda
Sto cercando di ottenere una comprensione generale di come utilizzare ICustomTypeDescriptor, TypeDescriptionProvider, TypeConverter e UITypeEditor per modificare il modo in cui un PropertyGrid viene visualizzato e si interfaccia con un oggetto.
Qualcuno può dirmi se è giusto o se ho tralasciato qualche concetto o punto importante?Sto davvero solo cercando di capire perché e quando utilizzeresti ogni lezione.
ICustomTypeDescriptor
- L'implementazione di questa interfaccia in una classe sovrascrive totalmente le proprietà native di una classe e le sostituisce con i PropertyDescriptors restituiti da ICustomTypeDescriptor.GetProperties()
TipoDescrizioneProvider
- Utilizzato per estendere le proprietà esistenti di una classe
- Un TypeDescriptionProvider viene aggiunto a una classe tramite un attributo TypeDescriptionProvider
- Il metodo GetTypeDescriptor() di TypeDescriptionProvider restituisce un ICustomTypeDescriptor aggiunto alle proprietà esistenti del tipo.
- Un PropertyGrid mostrerà sia le proprietà della classe trovata tramite Reflection, sia le proprietà aggiunte alla classe tramite TypeDescriptionProvider
TypeConverter
- Converte tra tipi
- In termini di utilizzo di un PropetyGrid utilizzato per la conversione tra tipi complessi e tipi primitivi che possono essere visualizzati/modificati nella griglia delle proprietà.
- Il metodo GetStandardvalues di un TypeConverter può essere utilizzato anche per mostrare un elenco di possibili valori nella propertygrid
UITypeEditor
- Definisce un editor personalizzato per manipolare una proprietà di tipo complesso.
- Associato a una proprietà tramite un attributo.
Pertanto ICustomTypeDescriptor e un provider TypeDescription vengono utilizzati per aggiungere/modificare/sostituire intere proprietà degli oggetti.TypeConverter e UITypeEditor vengono applicati alle singole proprietà e controllano il modo in cui vengono interfacciate tali proprietà specifiche.
Soluzione
Ritocchi:
TypeDescriptionProvider
- Ancora sostituisce metadati (non estesi)
- può anche essere aggiunto essere
TypeDescriptor.AddProvider
- può essere applicato per tipo e per istanza, rendendo possibile l'applicazione agli elenchi senza dover implementare
ITypedList
TypeConverter
- per
PropertyGrid
, questo è anche il meccanismo utilizzato per ottenere i metadati;notare cheExpandableObjectConverter
semplicemente delega aTypeDescriptor.GetProperties
, ma non è sempre così - responsabile anche della ricreazione di oggetti immutabili (come le strutture) con modifiche
- per
UITypeEditor
- responsabile anche della verniciatura della casella di anteprima
PropertyGrid
- responsabile anche della verniciatura della casella di anteprima
Ulteriori:
IExtenderProvider
- aggiunge proprietà;questo potrebbe essere ciò con cui ti stavi confondendoTypeDescriptionProvider
ITypedList
- sostanzialmente il gemello diICustomTypeDescriptor
, ma per gli elenchi;può essere evitato utilizzandoTypeDescriptionProvider
e un indicizzatore non oggetto su anyIList
, cioè.public T this[int index] {get;}
IListSource
- fornisce un collegamento indiretto tra una fonte di dati e i dati;per esempio, aDataTable
implementaIListSource
, tornandoDefaultView
quando richiesto