Share via


TypeConverter e XAML

Aggiornamento: novembre 2007

La classe TypeConverter svolge un ruolo particolare come parte dell'implementazione per una classe personalizzata gestita che può essere utilizzata come valore della proprietà nell'utilizzo degli attributi Extensible Application Markup Language (XAML). Se si scrive una classe personalizzata e si desidera che le istanze della classe siano utilizzabili come valori di attributi Extensible Application Markup Language (XAML) che è possibile impostare, potrebbe essere necessario applicare un oggetto TypeConverterAttribute alla classe, scrivere una classe TypeConverter personalizzata o eseguire entrambe le operazioni.

Nel presente argomento sono contenute le seguenti sezioni.

  • Valori XAML e di stringa
  • Implementazione di un convertitore di tipi
  • Applicazione di TypeConverterAttribute
  • Argomenti correlati

Valori XAML e di stringa

Quando si imposta un valore dell'attributo in XAML, il tipo iniziale di quel valore sarà String. Anche altre primitive, ad esempio Double, inizialmente sono stringhe di un processore XAML; tuttavia, la conversione ad altri valori di primitiva di tipo non stringa o da valori denominati di un'enumerazione risulta relativamente semplice grazie alle conversioni dei tipi incorporati.

Un processore XAML deve disporre di due informazioni per elaborare un valore dell'attributo. La prima informazione è il tipo di valore della proprietà che si imposta. Qualsiasi stringa che definisce un valore dell'attributo e che viene elaborata in XAML deve essere convertita o risolta in un valore di quel tipo. Se il valore è un primitiva, viene tentata una conversione diretta della stringa. Se il valore è costituito da un'enumerazione, la stringa viene utilizzata per verificare una corrispondenza del nome in quell'enumerazione. Se il valore non è rappresentato né da una primitiva né da un'enumerazione, il tipo in questione deve essere in grado di fornire un'istanza del tipo o un valore basato su una stringa convertita.

Un caso speciale è costituito dalle estensioni di markup. Gli utilizzi delle estensioni di markup devono essere gestiti da un processore XAML prima di verificare il tipo di proprietà e di considerare altri aspetti. In generale lo scopo di un'estensione di markup è quello di elaborare una stringa e restituire un oggetto. Se l'oggetto restituito è una corrispondenza di tipo per la proprietà, l'estensione di markup fornisce un valore per una proprietà evitando che venga eseguita qualsiasi conversione di tipo al di fuori del codice di implementazione dell'estensione di markup. Un caso comune che richiede un'estensione di markup è quello in cui si crea un riferimento a un oggetto già esistente. Nella migliore delle ipotesi, un convertitore di tipi senza stato potrebbe solo generare una nuova istanza che non necessariamente è appropriata. Per ulteriori informazioni sulle estensioni di markup, vedere Estensioni di markup e XAML.

TypeConverter

Se il valore non è un tipo primitivo o un'enumerazione e l'estensione di markup non viene utilizzata, sarà necessario individuare un altro modo per convertire String nel valore adatto o in una nuova istanza quando la sintassi XAML viene elaborata. Questa attività può essere svolta dall'implementazione di TypeConverter. TypeConverter definisce quattro membri che sono rilevanti per la conversione da e verso le stringhe al fine di elaborare la sintassi XAML:

Tra questi, il metodo più importante è ConvertFrom. Questo metodo converte la stringa di input nel tipo di oggetto richiesto.

Il secondo metodo in ordine di importanza è ConvertTo. Se un'applicazione WPF viene convertita in una rappresentazione del markup (se, ad esempio, viene salvata in XAML), ConvertTo sarà responsabile della creazione di una rappresentazione del markup.

CanConvertTo e CanConvertFrom sono metodi di supporto utilizzati quando un servizio esegue una query sulle funzionalità dell'implementazione di TypeConverter. È necessario implementare questi metodi affinché restituiscano true in determinati casi, in particolare per il tipo String.

Implementazione di un convertitore di tipi

Implementazione di ConvertFrom

Per essere utilizzabile come implementazione di TypeConverter che supporti XAML, il metodo ConvertFrom per tale convertitore deve accettare una stringa come parametro value. Se la stringa ha un formato valido e può essere convertita dall'implementazione di TypeConverter, l'oggetto restituito deve supportare il casting nel tipo previsto dalla proprietà. In caso contrario, l'implementazione ConvertFrom deve restituire null.

Ciascuna implementazione di TypeConverter può avere un'interpretazione diversa della validità di una stringa per una conversione e può quindi utilizzare o ignorare i contesti di descrizione del tipo o di impostazione cultura passati come parametri. Tuttavia, l'elaborazione della sintassi XAML di WPF potrebbe non passare i valori al contesto della descrizione del tipo in tutti i casi e potrebbe perfino non passare le impostazioni cultura basate su lang-xml.

Nota

Non utilizzare i caratteri parentesi graffa, in particolare {, come elemento del formato stringa. Questi caratteri vengono utilizzati esclusivamente come punti di ingresso e di uscita di una sequenza di estensione del markup.

Implementazione di ConvertTo

ConvertTo viene potenzialmente utilizzato per il supporto della serializzazione. Il supporto della serializzazione per il tipo personalizzato non è un requisito assoluto. Tuttavia, se si implementa un controllo o si utilizza la serializzazione come parte delle funzionalità o della progettazione della classe, sarà necessario implementare ConvertTo.

Per essere utilizzabile come implementazione di TypeConverter che supporti XAML, il metodo ConvertTo per tale convertitore deve accettare il supporto di un'istanza del tipo (o un valore) come parametro value. Quando il parametro destinationType è di tipo String, deve essere possibile eseguire il casting dell'oggetto restituito all'oggetto String. La stringa restituita deve rappresentare un valore serializzato di value. In teoria, il formato di serializzazione scelto deve essere in grado di generare lo stesso valore se quella stringa fosse passata all'implementazione di ConvertFrom dello stesso convertitore, senza perdite significative di informazioni.

Se il valore non può essere serializzato o il convertitore non supporta la serializzazione, l'implementazione di ConvertTo deve restituire null e in questo caso sarà possibile generare un'eccezione.

Se il parametro destinationType non è di tipo String, è possibile scegliere la gestione del convertitore. In genere, viene ripristinata la gestione dell'implementazione di base.

Ciascuna implementazione di TypeConverter può avere un'interpretazione diversa della validità di una stringa per una conversione e può quindi utilizzare o ignorare i contesti di descrizione del tipo o di impostazione cultura passati come parametri.

Nota

Non utilizzare i caratteri parentesi graffa, in particolare {, come elemento del formato stringa. Questi caratteri vengono utilizzati esclusivamente come punti di ingresso e di uscita di una sequenza di estensione del markup.

Implementazione di CanConvertTo

L'implementazione di CanConvertTo deve restituire true per un oggetto destinationType di tipo String; in caso contrario, deve rinviare all'implementazione di base.

Implementazione di CanConvertFrom

L'implementazione di CanConvertFrom deve restituire true per un oggetto sourceType di tipo String; in caso contrario, deve rinviare all'implementazione di base.

Applicazione di TypeConverterAttribute

Affinché il convertitore di tipi personalizzato sia utilizzato come convertitore di tipi operativo per una classe personalizzata, è necessario applicare l'oggetto attributo .NET FrameworkTypeConverterAttribute alla definizione della classe. L'oggetto ConverterTypeName specificato tramite l'attributo deve corrispondere al nome di tipo del convertitore dei tipi personalizzato. Avendo applicato questo attributo, quando un processore XAML gestisce valori per i quali il tipo di proprietà utilizza il tipo di classe personalizzato, può immettere le stringhe e restituire le istanze dell'oggetto.

È anche possibile fornire un convertitore dei tipi per le singole proprietà. Anziché applicare un attributo .NET Framework TypeConverterAttribute alla definizione della classe, applicarlo a una definizione della proprietà (la definizione principale, non le implementazioni di get/set all'interno di essa). Il tipo della proprietà deve corrispondere al tipo elaborato dal convertitore dei tipi personalizzato. Se questo attributo viene applicato, quando un processore XAML gestisce i valori di quella proprietà, può elaborare stringhe di input e restituire istanze di oggetti. La tecnica del convertitore dei tipi per singole proprietà risulta particolarmente utile se si sceglie di utilizzare un tipo di proprietà dall'Microsoft .NET Framework o da qualche altra libreria in cui non è possibile controllare la definizione della classe né applicare un oggetto TypeConverterAttribute.

Vedere anche

Concetti

Cenni preliminari su XAML

Estensioni di markup e XAML

Terminologia della sintassi XAML

Riferimenti

TypeConverter