Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Los convertidores de tipos proporcionan lógica para un sistema de escritura de objetos que convierte una cadena de marcado XAML en los objetos concretos de un gráfico de objetos. En los Servicios XAML de .NET Framework, el convertidor de tipos debe ser una clase que se deriva de TypeConverter. Algunos convertidores también admiten la ruta de acceso de guardar de XAML y se pueden usar para serializar un objeto en forma de cadena en el marcado de serialización. En este tema se describe cómo y cuándo se invocan los convertidores de tipos en XAML, y proporciona consejos de implementación para las invalidaciones de método de TypeConverter.
Este tema contiene las secciones siguientes.
- Conceptos de conversión de tipos
- Implementar un convertidor de tipos
- Aplicar TypeConverterAttribute
- Obtener acceso al contexto de proveedor de servicios desde una implementación de extensión de marcado
- Convertidores de tipos en el flujo de nodo XAML
- Temas relacionados
Conceptos de conversión de tipos
En las siguientes secciones se explican conceptos básicos acerca de cómo XAML usa las cadenas, y cómo los sistemas de escritura de objetos de los Servicios XAML de .NET Framework usan los convertidores de tipos para procesar algunos de los valores de cadena que se encuentran en un origen XAML.
XAML y valores de cadena
Cuando se establece un valor de atributo en un archivo XAML, el tipo inicial de ese valor es, en términos generales, una cadena, y un valor de atributo de cadena según se entiende en XML. Incluso otros primitivos como Double son inicialmente cadenas para un procesador XAML.
En la mayoría de los casos, 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 primitivo que el analizador de XAML entiende (como un valor numérico), se intenta una conversión directa de la cadena. Si el valor para el atributo hace referencia a una enumeración, se comprueba en la cadena proporcionada si existe una coincidencia del nombre con una constante con nombre en esa enumeración. Si el valor no es un primitivo que el analizador entiende ni un nombre de constante de una enumeración, el tipo en cuestión debe poder proporcionar un valor o una referencia basados en una cadena convertida.
![]() |
---|
Las directivas de lenguaje XAML no utilizan los convertidores de tipos. |
Convertidores de tipos y extensiones de marcado
Los usos de las extensiones de marcado deben controlarse en un procesador XAML antes de que este compruebe el tipo de propiedad y otras consideraciones. Por ejemplo, si una propiedad que se suele establecer como atributo normalmente tiene una conversión de tipos, pero en un caso concreto se establece mediante el uso de una extensión de marcado, el comportamiento de la extensión de marcado se procesa en primer lugar. Una situación común en la que se necesita una extensión de marcado consiste en realizar una referencia a un objeto que ya existe. Para este escenario, un convertidor de tipos sin estado solamente puede generar una nueva instancia, lo que podría no ser conveniente. Para obtener más información sobre las extensiones de marcado, vea Información general sobre las extensiones de marcado para el lenguaje XAML.
Convertidores de tipos nativos
En las implementaciones de servicios XAML de .NET y WPF, hay ciertos tipos CLR que tienen un control de la conversión de tipos nativo, pero esos tipos CLR no se consideran primitivos del modo convencional. Un ejemplo de uno de estos tipos es DateTime. Uno de los motivos es el funcionamiento de la arquitectura de .NET Framework: el tipo DateTime se define en mscorlib, la biblioteca más básica de .NET Framework. DateTime no puede recibir un atributo que proceda de otro ensamblado que presente una dependencia (TypeConverterAttribute pertenece a System). Por consiguiente, el mecanismo habitual de detección de convertidores de tipos mediante el uso de atributos no se admite. En su lugar, el analizador de XAML contiene una lista de tipos que necesitan este procesamiento nativo y los procesa de manera parecida a los primitivos auténticos. En el caso de DateTime este procesamiento conlleva una llamada a Parse.
Implementar un convertidor de tipos
En las siguientes secciones se discute la API de la clase TypeConverter.
TypeConverter
En los Servicios XAML de .NET Framework, todos los convertidores de tipos que se utilizan para XAML son clases que se derivan de la clase base TypeConverter. La clase TypeConverter existía en las versiones de .NET Framework anteriores a la existencia de XAML; uno de los escenarios originales de TypeConverter consistía en proporcionar la conversión de cadenas para los editores de propiedades en los diseñadores visuales.
Para XAML, se expande el rol de TypeConverter. Para los propósitos de XAML, TypeConverter es la clase base para proporcionar soporte a ciertas conversiones a cadenas y a partir de ellas. Las conversiones de cadenas permiten analizar un valor de atributo de cadena desde XAML. Las conversiones a cadenas podrían habilitar el procesamiento de un valor en tiempo de ejecución de una propiedad de objeto determinada en un atributo de XAML para la serialización.
TypeConverter define cuatro miembros que son pertinentes para convertir en cadenas y a partir de ellas con fines de procesamiento XAML:
De estos miembros, el método más importante es ConvertFrom, que convierte la cadena de entrada en el tipo de objeto necesario. El método ConvertFrom se puede implementar para convertir un intervalo mayor de tipos en el tipo de destino deseado del convertidor. Por consiguiente, puede servir para los propósitos que se extienden más allá de XAML, como admitir las conversiones en tiempo de ejecución. Sin embargo, para el uso de XAML, solo es importante la ruta de acceso del código que puede procesar una entrada String.
El segundo método en importancia es ConvertTo. Si una aplicación se convierte en una representación de marcado (por ejemplo, si se protege en XAML como archivo), ConvertTo está implicado en el escenario mayor en que los sistemas de escritura de texto XAML generan una representación de marcado. En este caso, la ruta de acceso de código principal para XAML es cuando el llamador pasa destinationType de String.
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 de modo que devuelvan true para los casos específicos del tipo admitidos por los métodos de conversión equivalentes del convertidor. Para los propósitos de XAML, suele ser el tipo String.
Información de la referencia cultural y convertidores de tipo para XAML
Cada implementación de TypeConverter puede interpretar únicamente lo que constituye una cadena válida para una conversión y, además, puede utilizar u omitir la descripción de los tipos pasados como parámetros. Una consideración importante para la referencia cultural y la conversión de tipos de XAML es la siguiente: aunque XAML admite el uso de cadenas traducibles como valores de atributo, estas cadenas traducibles no se pueden usar como entrada del convertidor de tipos con requisitos de referencia cultural concretos. Esta limitación se debe a que los convertidores de tipos para los valores de atributo de XAML implican un comportamiento del procesamiento XAML de lenguaje necesariamente fijo que usa la referencia cultural en-US. Para obtener más información acerca de las razones de diseño que motivan esta restricción, vea la especificación del lenguaje XAML ([MS-XAML]) o Información general sobre la localización y globalización de WPF.
Un ejemplo que ilustra por qué una referencia cultural puede ser un problema es cuando algunas referencias culturales utilizan una coma en lugar de un punto como delimitador de separador decimal para los números en forma de cadena. Este uso está en conflicto con el comportamiento de muchos convertidores de tipos existentes, que consiste en utilizar una coma como delimitador. Al pasar una referencia cultural a través de xml:lang en el XAML circundante, no se resuelve el problema.
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, el objeto devuelto debe admitir una conversión al tipo que espera la propiedad. De lo contrario, la implementación de ConvertFrom debe devolver null.
Cada implementación de TypeConverter puede interpretar únicamente 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.
![]() |
---|
No utilice llaves ({}), en concreto la llave de apertura ({), como elementos de formato de cadena.Estos caracteres están reservados como entrada y salida de una secuencia de extensión de marcado. |
Es adecuado iniciar una excepción cuando el convertidor de tipos debe obtener acceso a un servicio XAML desde el sistema de escritura de objetos de los Servicios XAML de .NET Framework, pero la llamada a GetService realizada contra el contexto no devuelve ese servicio.
Implementar ConvertTo
ConvertTo se utiliza potencialmente para admitir la serialización. Compatibilidad con la serialización a través de ConvertTo para su tipo personalizado y su convertidor de tipos no es un requisito imprescindible. 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 poderse convertir 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 que 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 y puede iniciar una excepción. Sin embargo, si se inician excepciones, debe notificarse la incapacidad de utilizar esa conversión como parte de la implementación de CanConvertTo para que se admita el procedimiento recomendado de comprobar primero con CanConvertTo para evitar las excepciones.
Si el parámetro destinationType no es del tipo String, puede elegir su propia administración de convertidor. Normalmente, se revertiría a la administración de la implementación base, que en el método ConvertTo base genera una excepción concreta.
Es adecuado iniciar una excepción cuando el convertidor de tipos debe obtener acceso a un servicio XAML desde el sistema de escritura de objetos de los Servicios XAML de .NET Framework, pero la llamada a GetService realizada contra el contexto no devuelve ese servicio.
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. No inicie excepciones desde CanConvertFrom.
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. No inicie excepciones desde CanConvertTo.
Aplicar TypeConverterAttribute
Para que los Servicios XAML de .NET Framework usen el convertidor de tipos personalizado como convertidor de tipos activo para una clase personalizada, es preciso aplicar el objeto TypeConverterAttribute de .NET Framework attribute 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. Si se aplica este atributo, cuando un procesador XAML controla los valores cuyo tipo de propiedad utiliza el tipo de la clase personalizada, puede especificar las cadenas de entrada y devolver instancias de objeto.
También puede proporcionar un convertidor de tipos para cada propiedad. En lugar de aplicar un objeto TypeConverterAttribute de .NET Framework attribute 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 de XAML controla los valores de esa propiedad, puede procesar las 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.
Para proporcionar un comportamiento de conversión de tipos para un miembro adjunto personalizado, aplique TypeConverterAttribute al método de descriptor de acceso Get del modelo de implementación para el miembro adjunto.
Obtener acceso al contexto de proveedor de servicios desde una implementación de extensión de marcado
Los servicios disponibles son los mismos para cualquier convertidor de valores. La diferencia radica en cómo cada convertidor de valores recibe el contexto del servicio. El acceso a los servicios y los servicios disponibles se documentan en el tema Convertidores de tipos y extensiones de marcado para XAML.
Convertidores de tipos en el flujo de nodo XAML
Si está trabajando con un flujo de nodo XAML, no se ejecuta todavía la acción o el resultado final de un convertidor de tipos. En una ruta de acceso de carga, la cadena de atributo que en el futuro necesita convertirse por tipo para cargarse permanece como un valor de texto entre un miembro de inicio y un miembro de fin. El convertidor de tipos que se necesita en el futuro para esta operación se puede determinar utilizando la propiedad XamlMember.TypeConverter. Sin embargo, obtener un valor válido de XamlMember.TypeConverter se basa en tener un contexto de esquema XAML, que puede tener acceso a tal información a través del miembro subyacente, o el tipo del valor de objeto que el miembro utiliza. Para invocar el comportamiento de la conversión de tipos, también se requiere el contexto de esquema XAML, porque esto precisa la asignación de tipo y la creación de una instancia del convertidor.
Vea también
Referencia
Conceptos
Información general sobre XAML (WPF)