Conversores de tipo e extensões de marcação para XAML

Conversores de tipo e extensões de marcação são duas técnicas que os sistemas de tipo XAML e os gravadores XAML usam para gerar componentes de gráfico de objeto. Embora compartilhem algumas características, os conversores de tipo e as extensões de marcação são representados de forma diferente em um fluxo de nó XAML. Neste conjunto de documentação, conversores de tipo, extensões de marcação e construções semelhantes às vezes são coletivamente referidos como conversores de valor.

Conversores de valor

Em XAML, os conversores de valor são usados para vários cenários. A lista a seguir mostra os diferentes tipos de conversores de valor em XAML:

  • Conversor de tipo

  • Extensão de marcação

  • Serializador de valor

  • Classe relacionada ou classe de suporte que fornece a lógica para uma sintaxe de texto XAML

Conversores de tipo

Na definição dos Serviços XAML do .NET, os conversores de tipo são classes derivadas da classe CLR TypeConverter . TypeConverter é uma classe que estava no .NET antes da existência do XAML. Seu propósito original era oferecer suporte a janelas de propriedades e metáforas de edição baseadas em texto semelhantes para propriedades do IDE. A introdução do XAML ao .NET usa TypeConverter para converter uma sintaxe de texto (conforme encontrado em um valor de atributo ou um nó de valor XAML) em um objeto. TypeConverter também pode ser usado para serializar um valor de objeto para sintaxe de texto. TypeConverter também foi usado em implementações XAML específicas da estrutura anteriores no Windows Presentation Foundation (WPF) e no Windows Communication Foundation (WCF). Para obter mais informações sobre o TypeConverter em XAML, consulte Type Converters for XAML Overview.

Extensões de marcação

Na implementação dos Serviços XAML do .NET, as extensões de marcação são classes derivadas da MarkupExtension classe. As extensões de marcação são um conceito que, nesse formato, é originado pela linguagem XAML. Você pode pensar em uma extensão de marcação como sendo algo como uma sequência de escape extensível que chama uma classe de serviço para fornecer sua lógica. Em termos de marcação, os processadores XAML reconhecem universalmente uma extensão de marcação por uma sequência de texto que começa com uma chave de abertura ({) em uma cadeia de caracteres de texto.

As extensões de marcação diferem dos conversores de tipo. Os conversores de tipo são normalmente associados a tipos ou membros. Eles são invocados quando uma criação de gráfico de objeto ou uma serialização encontra sintaxe de texto associada a essas entidades.

As extensões de marcação são associadas a uma única classe de serviço de suporte, mas podem ser aplicadas a qualquer valor de membro. (No entanto, você pode implementar sua extensão de marcação para restringir deliberadamente seu uso a determinados membros ou tipos de destino, usando o contexto de serviço.) As extensões de marcação podem substituir uma associação de conversor de tipo. Ou você pode usá-los para especificar um valor de atributo para membros que, de outra forma, não dariam suporte a uma sintaxe de texto.

Para obter mais informações sobre o padrão de implementação de extensão de marcação para XAML, consulte Visão geral sobre extensões de marcação para XAML.

Serializadores de valor

A ValueSerializer é um conversor de tipo especializado otimizado para converter um objeto em uma cadeia de caracteres. Um ValueSerializer para XAML pode não implementar o ConvertFrom método. Uma ValueSerializer implementação obtém serviços de uma maneira que é como uma TypeConverter implementação. Os métodos virtuais fornecem um parâmetro de entrada context . O context parâmetro é do tipo IValueSerializerContext, que herda da IServiceProvider interface e tem um GetService método.

No sistema de tipo XAML e para implementações de gravador XAML que usam processamento de loop de nó XAML para serialização, um conversor de valor associado a um tipo ou membro é relatado por sua própria XamlType.ValueSerializer propriedade. O significado para os gravadores XAML que executam serialização é que, se um e existir, o conversor de XamlType.TypeConverter tipo deve ser usado para o caminho de carregamento e XamlType.ValueSerializer o serializador de valor deve ser usado para o caminho de salvamento. Se XamlType.TypeConverter existir, mas XamlType.ValueSerializer for null, o conversor de tipo também será usado para o caminho de salvamento.

Outros conversores de valor

Um conversor de valores é extensível além dos padrões específicos de um conversor de tipo ou uma extensão de marcação. No entanto, essa personalização também exigiria a redefinição do sistema de tipo XAML, conforme fornecido pelos Serviços XAML do .NET. O sistema de tipos XAML existente tem representações e sistemas de relatório para conversores de tipo, extensões de marcação e serializadores de valor, mas não para formas personalizadas de conversão de valor. Se você quiser criar conversores de valor personalizados, use o XamlValueConverter<TConverterBase> tipo.

Conversores de tipo e extensões de marcação em combinação

Extensões de marcação e conversores de tipo são usados para diferentes situações em XAML. Embora o contexto esteja disponível para usos de extensão de marcação, o comportamento de conversão de tipos de propriedades em que uma extensão de marcação fornece um valor geralmente não é verificado em implementações de extensão de marcação. Em outras palavras, mesmo se uma extensão de marcação retornar uma cadeia de caracteres de texto como sua ProvideValue saída, o comportamento de conversão de tipo nessa cadeia de caracteres como aplicado a uma propriedade específica ou tipo de valor de propriedade não será invocado. Geralmente, o objetivo de uma extensão de marcação é processar uma cadeia de caracteres e retornar um objeto sem qualquer conversor de tipo envolvido.

Contexto de serviço para um conversor de valor

Quando você implementa um conversor de valor, geralmente precisa acessar um contexto no qual o conversor de valor é aplicado. Esse contexto é conhecido como contexto de serviço. O contexto de serviço pode incluir informações como o contexto de esquema XAML ativo, acesso ao sistema de mapeamento de tipos que o contexto de esquema XAML e o gravador de objeto XAML fornecem e assim por diante. Para obter mais informações sobre os contextos de serviço disponíveis para um conversor de valor e como acessar os serviços que um contexto de serviço pode fornecer, consulte Contextos de serviço disponíveis para conversores de tipo e extensões de marcação.

Confira também