TypeConverters et XAML

Mise à jour : novembre 2007

La classe TypeConverter a une fonction particulière dans le cadre de l'implémentation d'une classe personnalisée gérée qui peut être utilisée comme une valeur de propriété dans l'utilisation d'attributs XAML (Extensible Application Markup Language). Si vous écrivez une classe personnalisée et voulez que les instances de la classe soient utilisables comme valeurs d'attribut XAML (Extensible Application Markup Language) définissables, vous pouvez devoir appliquer un TypeConverterAttribute à la classe ou écrire une classe TypeConverter personnalisée, ou les deux.

Cette rubrique comprend les sections suivantes.

  • XAML et valeurs de chaîne
  • Implémentation d'un convertisseur de type
  • Application de TypeConverterAttribute
  • Rubriques connexes

XAML et valeurs de chaîne

Lorsque vous définissez une valeur d'attribut en XAML, le type initial de cette valeur est String. Même d'autres primitives, telles que Double, sont initialement des chaînes dans un processeur XAML, bien que la conversion en valeurs de primitives non-chaîne ou depuis des valeurs nommées d'une énumération soit relativement simple du fait des conversions de type intégré.

Un processeur XAML a besoin de deux informations pour pouvoir traiter une valeur d'attribut. Le premier élément d'information est le type valeur de la propriété à définir. Toute chaîne qui définit une valeur d'attribut et traitée en XAML doit être convertie ou résolue en une valeur de ce type. Si la valeur est une primitive, une conversion directe de la chaîne est tentée. Si la valeur est une énumération, la chaîne est utilisée pour rechercher une correspondance de nom dans cette énumération. Si la valeur n'est ni une primitive, ni une énumération, le type en question doit être en mesure de fournir une instance du type ou une valeur, en fonction d'une chaîne convertie.

Un cas spécial est une extension de balisage. Les utilisations d'extension de balisage doivent être gérées par un processeur XAML avant de rechercher un type de propriété et toute autre considération. En règle générale, une extension de balisage a pour fonction de traiter une chaîne et de retourner un objet. Si l'objet retourné est une correspondance de type de la propriété, l'extension de balisage fournit une valeur pour une propriété d'une manière qui évite toute conversion de type en dehors du code d'implémentation de l'extension de balisage. La référence à un objet qui existe déjà (au mieux, un convertisseur de type sans état pourrait générer uniquement une nouvelle instance qui peut ne pas être désirable) est l'une des situations courantes dans lesquelles une extension de balisage est nécessaire. Pour plus d'informations sur les extensions de balisage, consultez Extensions de balisage et XAML.

TypeConverter

Si la valeur n'est pas un type primitif ni une énumération et que l'extension de balisage n'est pas utilisée, il doit alors y avoir une possibilité de convertir un String dans la valeur appropriée ou une nouvelle instance lors du traitement XAML. C'est le rôle de l'implémentation TypeConverter. Le TypeConverter définit quatre membres qui sont pertinents pour la conversion en chaînes et depuis des chaînes à des fins de traitement XAML :

La plus importante de ces méthodes est ConvertFrom. Cette méthode convertit la chaîne d'entrée en type d'objet requis.

La seconde méthode la plus importante est ConvertTo. Si une application WPF est convertie en une représentation de balise (par exemple, si elle est enregistrée en XAML), ConvertTo doit produire une représentation de balise.

CanConvertTo et CanConvertFrom sont des méthodes de support utilisées lorsqu'un service interroge les fonctions de l'implémentation TypeConverter. Vous devez implémenter ces méthodes pour retourner la valeur true dans certains cas, en particulier pour le type String.

Implémentation d'un convertisseur de type

Implémentation de ConvertFrom

Pour être utilisable comme une implémentation TypeConverter qui prend en charge le XAML, la méthode ConvertFrom du convertisseur doit accepter une chaîne comme paramètre value. Si la chaîne a un format valide et peut être convertie par l'implémentation TypeConverter, l'objet retourné doit alors pouvoir prendre en charge un cast dans le type attendu par la propriété. Sinon, l'implémentation ConvertFrom doit retourner null.

Chaque implémentation TypeConverter peut avoir sa propre interprétation de la validité d'une chaîne dans le cadre d'une conversion et peut également utiliser ou ignorer la description de type ou les contextes de culture passés comme paramètres. Toutefois, le XAML WPF qui assure le traitement peut ne pas passer de valeurs au contexte de description de type dans tous les cas, et peut également ne pas passer la culture en fonction de xml-lang.

Remarque :

N'utilisez pas les accolades, en particulier {, comme un élément possible de format de chaîne. Ces caractères sont réservés comme entrée et sortie d'une séquence d'extension de balisage.

Implémentation de ConvertTo

ConvertTo peut être utilisé pour assurer la prise en charge de la sérialisation. Le support de sérialisation de votre type personnalisé n'est pas une nécessité absolue. Toutefois, si vous implémentez un contrôle ou que vous utilisez la sérialisation dans le cadre des fonctionnalités ou de la conception de la classe, vous devez implémenter ConvertTo.

Pour être utilisable comme une implémentation TypeConverter qui prend en charge le XAML, la méthode ConvertTo de ce convertisseur doit accepter une instance du type (ou une valeur) pris en charge comme paramètre value. Lorsque le paramètre destinationType est de type String, l'objet retourné doit pouvoir faire l'objet d'un cast en String. La chaîne retournée doit représenter une valeur sérialisée de value. Idéalement, le format de sérialisation que vous choisissez doit pouvoir générer la même valeur si cette chaîne est passée à l'implémentation ConvertFrom du même convertisseur, sans perte significative d'information.

Si la valeur ne peut pas être sérialisée ou que le convertisseur ne prend pas en charge la sérialisation, l'implémentation ConvertTo doit retourner null et elle peut lever une exception dans ce cas.

Si le paramètre destinationType n'est pas de type String, vous pouvez choisir votre propre gestion de convertisseur. En général, vous revenez à la gestion d'implémentation de base.

Chaque implémentation TypeConverter peut avoir sa propre interprétation de la validité d'une chaîne dans le cadre d'une conversion et peut également utiliser ou ignorer la description de type ou les contextes de culture passés comme paramètres.

Remarque :

N'utilisez pas les accolades, en particulier {, comme un élément possible de format de chaîne. Ces caractères sont réservés comme entrée et sortie d'une séquence d'extension de balisage.

Implémentation de CanConvertTo

L'implémentation CanConvertTo doit retourner la valeur true pour destinationType de type String, et sinon déférer à l'implémentation de base.

Implémentation de CanConvertFrom

L'implémentation CanConvertFrom doit retourner la valeur true pour sourceType de type String, et sinon déférer à l'implémentation de base.

Application de TypeConverterAttribute

Pour pouvoir utiliser le convertisseur de type personnalisé comme convertisseur de type pour une classe personnalisée, vous devez appliquer l'attribut .NET FrameworkTypeConverterAttribute à la définition de classe. Le ConverterTypeName que vous spécifiez à travers l'attribut doit être le nom de type du convertisseur de type personnalisé. Avec cet attribut appliqué, lorsqu'un processeur XAML gère des valeurs où le type de propriété utilise le type de classe personnalisée, il peut entrer des chaînes et retourner des instances d'objet.

Vous pouvez également fournir un convertisseur de type en fonction de la propriété. Au lieu d'appliquer un attribut .NET FrameworkTypeConverterAttribute à la définition de classe, appliquez-le à une définition de propriété (la définition principale et non pas les implémentations get/set qui s'y trouvent). Le type de la propriété doit correspondre au type traité par le convertisseur de type personnalisé. Avec cet attribut appliqué, lorsqu'un processeur XAML gère des valeurs de cette propriété, il peut traiter des chaînes d'entrée et retourner des instances d'objet. La technique de conversion en fonction de la propriété est particulièrement utile si vous choisissez d'utiliser un type de propriété Microsoft .NET Framework ou d'une autre bibliothèque où vous ne pouvez pas contrôler la définition de classe et ne pouvez pas appliquer un TypeConverterAttribute à cet endroit.

Voir aussi

Concepts

Vue d'ensemble du langage XAML

Extensions de balisage et XAML

Terminologie de la syntaxe XAML

Référence

TypeConverter