Compartilhar via


Coleções e tipos de coleção para XAML

Este artigo descreve como definir propriedades de tipos destinados a dar suporte a uma coleção e dar suporte à sintaxe XAML para instanciar itens de coleção como filhos de elementos de um elemento de objeto pai ou elemento de propriedade.

Conceitos da coleção XAML

Conceitualmente, qualquer relação em XAML em que haja vários itens filho dentro do escopo de um elemento de objeto XAML ou elemento de propriedade XAML deve ser implementada como uma coleção. Essa coleção deve ser associada a uma propriedade XAML específica do tipo XAML que é o pai nessa relação. A propriedade deve ser uma coleção porque um processador XAML espera atribuir cada item na marcação para ser um item recém-adicionado da propriedade de coleção de backup.

No nível da linguagem XAML, os requisitos exatos de suporte à coleção não são totalmente definidos. O conceito de que uma coleção pode ser uma lista ou um dicionário (mas não ambos) é definido no nível da linguagem XAML, mas quais tipos de backup representam listas ou dicionários não é definido pela linguagem XAML.

Nos Serviços XAML do .NET, o conceito de suporte à coleção XAML é mais claramente definido em termos de tipos de backup do .NET. Especificamente, o suporte XAML para coleções baseia-se em vários conceitos e APIs do .NET que são usados para listas e dicionários na programação geral do .NET.

  1. A interface IList indica uma coleção de listas.

  2. A interface IDictionary indica uma coleção de dicionários.

  3. Array representa uma matriz e uma matriz dá suporte a métodos IList.

Em cada um desses conceitos de coleção, um processador XAML dos Serviços XAML do .NET espera chamar o método Add em uma instância específica do tipo da propriedade da coleção. Ou, em um cenário de serialização, um processador XAML produz instâncias de tipo XAML discretas para cada item encontrado na lista, dicionário ou matriz com base no conceito específico de "Itens" de cada coleção. Estes itens são: IList.Item[]; IDictionary.Item[]; o Array.IList.Item[] explícito para Array.

Coleções genéricas

Coleções genéricas podem ser úteis para programação geral do .NET e também podem ser usadas para propriedades de coleção XAML. No entanto, as interfaces genéricas IList<T> e IDictionary<TKey,TValue> não são identificadas por processadores XAML dos Serviços XAML do .NET como equivalentes aos IList ou IDictionarynão genéricos. Em vez de implementar as interfaces, uma abordagem recomendada para tipos de propriedade de coleção genérica é derivar das classes List<T> ou Dictionary<TKey,TValue>. Essas classes implementam as interfaces não genéricas e, portanto, incluem o suporte esperado para coleções XAML na implementação base.

Coleções de Read-Only e lógica de inicialização

Na programação do .NET, é um padrão de design comum tornar qualquer propriedade que contenha um valor de uma coleção como uma coleção somente leitura. Esse padrão permite que a instância que possui a propriedade de coleção controle melhor o que acontece com a coleção. Especificamente, o padrão impede a substituição acidental de toda a coleção pré-existente definindo a propriedade. Nesse padrão, qualquer acesso à coleção por chamadores deve, em vez disso, ser feito chamando métodos ou propriedades, conforme suportado pelo tipo de coleção e/ou pelas interfaces de coleção relevantes, como IList.

Usar esse padrão implica que qualquer classe que exponha uma propriedade de coleção somente leitura deve primeiro inicializar essa propriedade para manter uma coleção vazia. Normalmente, a inicialização é executada como parte do comportamento de construção da classe. Para ser útil para XAML, é importante que essa lógica seja sempre referenciada pelo construtor sem parâmetros, pois o XAML geralmente chama o construtor sem parâmetros antes de processar as propriedades (propriedades da coleção ou não).

Suporte e coleções do sistema de tipo XAML

Além da mecânica básica de análise de XAML e preenchimento ou serialização de propriedades de coleção, o sistema de tipos XAML, conforme implementado nos Serviços XAML do .NET, inclui vários recursos de design que pertencem a coleções no XAML.

  1. IsCollection retornará true se o tipo XAML for apoiado por um tipo que forneça suporte à coleção XAML.

  2. IsDictionary e IsArray podem identificar ainda mais qual modo de coleção o tipo XAML dá suporte. Para processadores XAML personalizados que se baseiam nos Serviços XAML do .NET e no sistema de tipos XAML, mas não com base em implementações de XamlWriter existentes, saber qual modo de coleta é usado pode ser necessário para saber qual método invocar para processamento de coleção.

  3. Cada um dos valores de propriedade anteriores é potencialmente influenciado por substituições de LookupCollectionKind em um tipo XAML.