Clases TypeConverter y XAML

Actualización: noviembre 2007

La clase TypeConverter tiene una finalidad concreta como parte de la implementación para una clase personalizada administrada que se puede utilizar como un valor de propiedad en el uso de atributos Lenguaje de marcado de aplicaciones extensible (XAML). Si escribe una clase personalizada, y desea que las instancias de su clase se puedan utilizar como valores de atributos Lenguaje de marcado de aplicaciones extensible (XAML) que se pueden establecer, podría necesitar aplicar TypeConverterAttribute a su clase, escribir una clase TypeConverter personalizada, o ambas cosas.

Este tema contiene las secciones siguientes.

  • XAML y valores de cadena
  • Implementar un convertidor de tipos
  • Aplicar TypeConverterAttribute
  • Temas relacionados

XAML y valores de cadena

Al establecer un valor de atributo en XAML, el tipo inicial de ese valor es String. Incluso otros tipos primitivos, como Double, son cadenas inicialmente en un procesador XAML, aunque la conversión a otros valores primitivos no de cadena o a partir de valores con nombre de una enumeración resulta relativamente sencilla gracias a las conversiones de tipos integradas.

Un procesador XAML necesita dos fragmentos de información para procesar un valor de atributo. El primer fragmento es el tipo de valor de la propiedad que se establece. Cualquier cadena que define un valor de atributo y que se procesa en XAML se debe convertir o resolver finalmente a un valor de ese tipo. Si el valor es un tipo primitivo, se intenta una conversión directa de la cadena. Si el valor es una enumeración, la cadena se utiliza para comprobar una coincidencia de nombre en esa enumeración. Si el valor no es primitivo ni una enumeración, el tipo en cuestión debe poder proporcionar una instancia del tipo, o un valor, basado en una cadena convertida.

Un caso especial es una extensión de marcado. Los usos de las extensiones de marcado deben administrarse en un procesador XAML antes de comprobar el tipo de propiedad y otras consideraciones. En general, el propósito de una extensión de marcado es procesar una cadena y devolver un objeto. Si el objeto devuelto es una coincidencia de tipo para la propiedad, la extensión de marcado proporciona un valor para una propiedad de tal forma que evita cualquier conversión de tipos que tenga lugar fuera del código de implementación de la extensión de marcado. Una situación común en que se necesita una extensión de marcado es la realización de una referencia a un objeto que ya existe (en el mejor de los casos, un convertidor de tipos sin estado únicamente podría generar una nueva instancia, lo que podría no ser deseable). Para obtener más información sobre las extensiones de marcado, vea Extensiones de marcado y XAML.

TypeConverter

Si el valor no es ningún tipo primitivo ni una enumeración, ni hay ningún uso de extensión de marcado, entonces debe haber algún medio para convertir String en el valor adecuado o en una nueva instancia al procesar el XAML. Ésta es la función de la implementación de TypeConverter. TypeConverter define cuatro miembros que son pertinentes para convertir en cadenas y desde ellas a fin de procesar el XAML:

De ellos, el método más importante es ConvertFrom. Este método convierte la cadena de entrada en el tipo de objeto necesario.

El siguiente método en importancia es ConvertTo. Si una aplicación de WPF se convierte en una representación de marcado (por ejemplo, si se guarda en XAML), ConvertTo es responsable de generar una representación de marcado.

CanConvertTo y CanConvertFrom son métodos de compatibilidad que se utilizan cuando un servicio consulta las funciones de la implementación de TypeConverter. Debe implementar estos métodos para devolver true en algunos casos, en particular para el tipo String.

Implementar un convertidor de tipos

Implementar ConvertFrom

Para poder utilizarlo como una implementación de TypeConverter que admite XAML, el método ConvertFrom para ese convertidor debe aceptar una cadena como el parámetro value. Si el formato de la cadena es válido y la implementación de TypeConverter la puede convertir, entonces el objeto devuelto debe admitir una conversión al tipo esperado por la propiedad. De lo contrario, la implementación de ConvertFrom debe devolver null.

Cada implementación de TypeConverter puede tener su propia interpretación de lo que constituye una cadena válida para una conversión y, además, puede utilizar u omitir la descripción de tipos o los contextos de referencia cultural pasados como parámetros. Sin embargo, el procesamiento XAML de WPF podría no pasar valores al contexto de descripción de tipos en todos los casos, ni tampoco referencias culturales basadas en xml-lang.

Nota

No utilice los caracteres de llave, en particular {, como elementos posibles del formato de cadena. Estos caracteres están reservados como entrada y salida de una secuencia de extensión de marcado.

Implementar ConvertTo

ConvertTo se utiliza potencialmente para admitir la serialización. La compatibilidad con la serialización para los tipos personalizados no es un requisito absoluto. Sin embargo, si implementa un control, o utiliza la serialización como parte de las características o del diseño de la clase, debe implementar ConvertTo.

Para poder utilizarlo como una implementación de TypeConverter que admite XAML, el método ConvertTo para ese convertidor debe aceptar una instancia del tipo (o un valor) admitido como parámetro value. Cuando el parámetro destinationType es del tipo String, el objeto devuelto debe ser convertible a String. La cadena devuelta debe representar un valor serializado de value. En la situación ideal, el formato de serialización elegido deberá ser capaz de generar el mismo valor si esa cadena se pasara a la implementación de ConvertFrom del mismo convertidor, sin ninguna pérdida significativa de información.

Si el valor no se puede serializar, o si el convertidor no admite la serialización, la implementación de ConvertTo debe devolver null, en cuyo caso se permite que inicie una excepción.

Si el parámetro destinationType no es del tipo String, puede elegir su propia administración de convertidor. Normalmente, se revierte a la administración de implementación base.

Cada implementación de TypeConverter puede tener su propia interpretación de lo que constituye una cadena válida para una conversión y, además, puede utilizar u omitir la descripción de tipos o los contextos de referencia cultural pasados como parámetros.

Nota

No utilice los caracteres de llave, en particular {, como elementos posibles del formato de cadena. Estos caracteres están reservados como entrada y salida de una secuencia de extensión de marcado.

Implementar CanConvertTo

La implementación de CanConvertTo debe devolver true para destinationType de tipo String y, de lo contrario, diferir la evaluación a la implementación base.

Implementar CanConvertFrom

La implementación de CanConvertFrom debe devolver true para sourceType de tipo String y, de lo contrario, diferir la evaluación a la implementación base.

Aplicar TypeConverterAttribute

Para que el convertidor de tipos personalizado se utilice como convertidor de tipos activo para una clase personalizada, debe aplicar el Atributo de .NET Framework TypeConverterAttribute a la definición de clase. La propiedad ConverterTypeName que se especifica a través del atributo debe ser el nombre de tipo del convertidor de tipos personalizado. Con este atributo aplicado, cuando un procesador XAML administra valores cuyo tipo de propiedad utiliza el tipo de la clase personalizada, puede especificar cadenas y devolver instancias de objeto.

También puede proporcionar un convertidor de tipos para cada propiedad. En lugar de aplicar un Atributo de .NET Framework TypeConverterAttribute a la definición de clase, aplíqueselo a una definición de propiedad (a la definición principal, no a las implementaciones de get/set que contiene). El tipo de la propiedad debe coincidir con el tipo procesado por el convertidor de tipos personalizado. Con este atributo aplicado, cuando un procesador XAML administra valores de esa propiedad, puede procesar cadenas de entrada y devolver instancias de objeto. La técnica del convertidor de tipos para cada propiedad resulta especialmente útil si decide utilizar un tipo de propiedad de Microsoft .NET Framework o de alguna otra biblioteca donde no se puede controlar la definición de clase ni aplicar TypeConverterAttribute.

Vea también

Conceptos

Información general sobre XAML

Extensiones de marcado y XAML

Terminología de la sintaxis de XAML

Referencia

TypeConverter