Convertidores de tipos y extensiones de marcado para XAML

Los convertidores de tipos y extensiones de marcado son dos técnicas que los sistemas de tipos XAML y escritores de XAML utilizan para generar componentes de gráfico de objeto. Aunque comparten algunas características, los convertidores de tipos y las extensiones de marcado se representan de forma diferente en una secuencia de nodo XAML. En este conjunto de documentación, en ocasiones nos referimos colectivamente a los convertidores de tipos, las extensiones de marcado y construcciones similares como convertidores de valores.

Convertidores de valores

En XAML, los convertidores de valores se utilizan para varios escenarios. La lista siguiente muestra los distintos tipos de convertidores de valores en XAML:

  • Convertidor de tipos

  • Extensión de marcado

  • Serializador de valor

  • Clase relacionada o clase de compatibilidad que proporciona la lógica para una sintaxis de texto XAML

Convertidores de tipos

En la definición de los servicios XAML de .NET los convertidores de tipo son clases que derivan de la clase TypeConverter de CLR. TypeConverter es una clase que se encontraba en .NET antes de que existiera XAML. Su propósito original era admitir ventanas de propiedades y metáforas similares de edición basada en texto para las propiedades de IDE. La introducción de XAML en .NET usa TypeConverter para convertir una sintaxis de texto (tal como se encuentra en un valor de atributo o en un nodo de valor XAML) en un objeto. TypeConverter también se puede utilizar para serializar el valor de un objeto en sintaxis de texto. TypeConverter también se usaba en anteriores implementaciones XAML específicas del marco en Windows Presentation Foundation (WPF) y Windows Communication Foundation (WCF). Para más información sobre TypeConverter en XAML, vea Type Converters for XAML Overview.

Extensiones de marcado

En la implementación de los servicios XAML de .NET las extensiones de marcado son clases que derivan de la clase MarkupExtension. Las extensiones de marcado son un concepto se origina con esta forma en el lenguaje XAML. Puede pensar en una extensión de marcado como algo similar a una secuencia de escape extensible que llama a una clase de servicio para que proporcione su lógica. En términos de marcado, los procesadores de XAML reconocen universalmente una extensión de marcado mediante una secuencia de texto que comienza con una llave de apertura ({) en una cadena de texto.

Las extensiones de marcado difieren de los convertidores de tipos. Los convertidores de tipos se suelen asociados a tipos o miembros. Se invocan cuando la creación de un gráfico de objeto o una serialización encuentran sintaxis de texto que está asociada a esas entidades.

Las extensiones de marcado están asociadas con una sola clase de servicio de compatibilidad, pero se pueden aplicar para cualquier valor de miembro. (Sin embargo, puede implementar su extensión de marcado de forma que restrinja deliberadamente su uso a ciertos miembros o tipos de destino, mediante el contexto de servicio). Las extensiones de marcado pueden invalidar una asociación del convertidor de tipos. También puede utilizarlas para especificar un valor de atributo para los miembros que, de otra forma, no admitirían una sintaxis de texto.

Para más información sobre el patrón de implementación de extensión de marcado para XAML, vea Markup Extensions for XAML Overview.

Serializadores de valor

Un ValueSerializer es un convertidor de tipos especializado que está optimiza para convertir un objeto en una cadena. Un ValueSerializer para XAML podría no implementar el método ConvertFrom en absoluto. Una implementación de ValueSerializer obtiene los servicios de tal manera que es como una implementación de TypeConverter . Los métodos virtuales proporcionan un parámetro context de entrada. El parámetro context es de tipo IValueSerializerContext, que hereda de la interfaz IServiceProvider y tiene un método GetService .

En el sistema de tipos XAML y para las implementaciones de sistema de escritura XAML que usan el procesamiento de bucle de nodo XAML para la serialización, un convertidor de valores que está asociado a un tipo o miembro se notifica mediante su propia propiedad XamlType.ValueSerializer . El significado para los sistemas de escritura XAML que realizan la serialización es que, si existen XamlType.TypeConverter y XamlType.ValueSerializer , se debe usar el convertidor de tipos para la ruta de acceso de carga y se debe usar el serializador de valor para la ruta de acceso de guardado. Si XamlType.TypeConverter existe pero XamlType.ValueSerializer es null, el convertidor de tipos también se utiliza para la ruta de acceso de guardado.

Otros convertidores de valores

Un convertidor de valores es extensible más allá de los modelos concretos de un convertidor de tipos o una extensión de marcado. Sin embargo, esta personalización también requeriría la redefinición del sistema de tipos XAML proporcionado por los servicios XAML de .NET. El sistema de tipos XAML existente tiene representaciones y sistemas de notificación para convertidores de tipos, extensiones de marcado y serializadores de valor, pero no para formas personalizadas de conversión de valor. Si desea crear convertidores de valores personalizados, use el tipo XamlValueConverter<TConverterBase> .

Convertidores de tipos y extensiones de marcado en combinación

Las extensiones de marcado y los convertidores de tipos se utilizan para diferentes situaciones en XAML. Aunque el contexto está disponible para los usos de la extensión de marcado, en las implementaciones de extensión de marcado no se suele comprobar el comportamiento de conversión de tipos de aquellas propiedades en las que una extensión de marcado proporciona un valor. En otras palabras, aunque una extensión de marcado devuelva una cadena de texto como salida de ProvideValue , no se invoca el comportamiento de conversión de tipos en esa cadena al aplicarla a una propiedad determinada o a un tipo de valor de propiedad determinado. Por lo general, el propósito de una extensión de marcado es procesar una cadena y devolver un objeto sin ningún convertidor de tipos implicado.

Contexto de servicio para un convertidor de valores

Cuando se implementa un convertidor de valores, suele ser necesario acceder a un contexto en el que se aplica el convertidor de valores. Este contexto se conoce como el contexto de servicio. El contexto de servicio puede incluir información como el contexto de esquema XAML activo, acceso al sistema de asignación de tipos proporcionado por el contexto de esquema XAML y el escritor de objetos XAML, etc. Para más información sobre los contextos de servicio disponibles para un convertidor de valores y cómo acceder a los servicios que un contexto de servicio puede proporcionar, consulte Service Contexts Available to Type Converters and Markup Extensions.

Vea también