Convertitori di tipi ed estensioni di markup per XAML
I convertitori di tipi e le estensioni di markup sono due tecniche usate dai sistemi di tipi XAML e dai writer XAML per generare componenti dell'oggetto grafico. Anche se condividono alcune caratteristiche, i convertitori di tipi e le estensioni di markup sono rappresentati in modo diverso in un flusso di nodi XAML. In questo set di documentazione, convertitori di tipi, estensioni di markup e costrutti simili vengono talvolta definiti collettivamente convertitori di valori.
Convertitori di valori
In XAML i convertitori di valori vengono usati per vari scenari. L'elenco seguente mostra i diversi tipi di convertitori di valori in XAML:
Convertitore di tipi
Estensione di markup
Serializzatore di valori
Classe correlata o classe di supporto che fornisce la logica per una sintassi di testo XAML
Convertitori di tipi
Nella definizione dei servizi XAML .NET i convertitori di tipi sono classi che derivano dalla classe CLR TypeConverter. TypeConverter è una classe presente in .NET prima dell'esistenza di XAML. Lo scopo originale era quello di supportare finestre delle proprietà e metafore di modifica simili basate su testo per le proprietà dell'IDE. L'introduzione di XAML a .NET usa TypeConverter per convertire una sintassi di testo (come trovato in un valore di attributo o un nodo valore XAML) in un oggetto . TypeConverter può essere usato anche per serializzare un valore dell'oggetto nella sintassi di testo. TypeConverter è stato usato anche nelle implementazioni XAML specifiche del framework precedenti in Windows Presentation Foundation (WPF) e Windows Communication Foundation (WCF). Per altre informazioni sul TypeConverter in XAML, vedere Type Converters for XAML Overview.For more information about the TypeConverter in XAML, see Type Converters for XAML Overview.
Estensioni di markup
Nell'implementazione dei servizi XAML .NET le estensioni di markup sono classi che derivano dalla classe MarkupExtension. Le estensioni di markup sono un concetto che in questo formato è originato dal linguaggio XAML. È possibile pensare a un'estensione di markup come una sequenza di escape estendibile che chiama in una classe di servizio per fornire la logica. In termini di markup, i processori XAML riconoscono universalmente un'estensione di markup da una sequenza di testo che inizia con una parentesi graffa di apertura ({) in una stringa di testo.
Le estensioni di markup differiscono dai convertitori di tipi. I convertitori di tipi sono in genere associati a tipi o membri. Vengono richiamati quando la creazione di un oggetto grafico o una serializzazione rileva una sintassi di testo associata a tali entità.
Le estensioni di markup sono associate a una singola classe di servizio di supporto, ma possono essere applicate per qualsiasi valore membro. È tuttavia possibile implementare l'estensione di markup per limitare deliberatamente l'uso a determinati membri o tipi di destinazione, usando il contesto del servizio. Le estensioni di markup possono eseguire l'override di un'associazione del convertitore di tipi. In alternativa, è possibile usarli per specificare un valore di attributo per i membri che altrimenti non supportano una sintassi di testo.
Per altre informazioni sul modello di implementazione dell'estensione di markup per XAML, vedere Markup Extensions for XAML Overview.
Serializzatori di valori
Un ValueSerializer è un convertitore di tipi specializzato ottimizzato per la conversione di un oggetto in una stringa. Un ValueSerializer per XAML potrebbe non implementare affatto il metodo ConvertFrom
. Un'implementazione di ValueSerializer ottiene i servizi in modo analogo a un'implementazione di TypeConverter. I metodi virtuali forniscono un parametro di input context
. Il parametro context
è di tipo IValueSerializerContext, che eredita dall'interfaccia IServiceProvider e dispone di un metodo GetService.
Nel sistema dei tipi XAML e per le implementazioni del writer XAML che usano l'elaborazione del ciclo di nodi XAML per la serializzazione, un convertitore di valori associato a un tipo o un membro viene segnalato dalla propria proprietà XamlType.ValueSerializer. Il significato per i writer XAML che eseguono la serializzazione è che se esiste un XamlType.TypeConverter e XamlType.ValueSerializer, il convertitore di tipi deve essere usato per il percorso di caricamento e il serializzatore di valori deve essere usato per il percorso di salvataggio. Se XamlType.TypeConverter esiste ma XamlType.ValueSerializer è null
, viene usato anche il convertitore di tipi per il percorso di salvataggio.
Altri convertitori di valori
Un convertitore di valori è estendibile oltre i modelli specifici di un convertitore di tipi o di un'estensione di markup. Tuttavia, questa personalizzazione richiederebbe anche la ridefinizione del sistema di tipi XAML, come fornito dai servizi XAML .NET. Il sistema di tipi XAML esistente include rappresentazioni e sistemi di creazione di report per convertitori di tipi, estensioni di markup e serializzatori di valori, ma non per forme personalizzate di conversione di valori. Se si desidera creare convertitori di valori personalizzati, usare il tipo di XamlValueConverter<TConverterBase>.
Convertitori di tipi ed estensioni di markup in combinazione
Le estensioni di markup e i convertitori di tipi vengono usati per situazioni diverse in XAML. Sebbene il contesto sia disponibile per gli utilizzi delle estensioni di markup, il comportamento di conversione dei tipi delle proprietà in cui un'estensione di markup fornisce un valore in genere non viene archiviato nelle implementazioni dell'estensione di markup. In altre parole, anche se un'estensione di markup restituisce una stringa di testo come output ProvideValue
, il comportamento di conversione dei tipi su tale stringa applicato a un tipo di proprietà o di proprietà specifico non viene richiamato. In genere, lo scopo di un'estensione di markup è elaborare una stringa e restituire un oggetto senza alcun convertitore di tipi coinvolto.
Contesto del servizio per un convertitore di valori
Quando si implementa un convertitore di valori, spesso è necessario accedere a un contesto in cui viene applicato il convertitore di valori. Questo contesto è noto come contesto del servizio. Il contesto del servizio può includere informazioni come il contesto dello schema XAML attivo, l'accesso al sistema di mapping dei tipi fornito dal contesto dello schema XAML e dal writer di oggetti XAML e così via. Per altre informazioni sui contesti di servizio disponibili per un convertitore di valori e su come accedere ai servizi che un contesto di servizio potrebbe fornire, vedere Contesti di servizio disponibili per convertitori di tipi e estensioni di markup.
Vedere anche
.NET Desktop feedback