Raccolte e tipi di raccolta per XAML

Questo articolo descrive come definire le proprietà dei tipi destinati a supportare una raccolta e supportare la sintassi XAML per creare un'istanza degli elementi della raccolta come elementi figlio di un elemento padre o di un elemento proprietà.

Concetti relativi alla raccolta XAML

Concettualmente, qualsiasi relazione in XAML in cui sono presenti più elementi figlio nell'ambito di un elemento oggetto XAML o di un elemento proprietà XAML deve essere implementata come raccolta. Tale raccolta deve essere associata a una particolare proprietà XAML del tipo XAML padre in tale relazione. La proprietà deve essere una raccolta perché un processore XAML prevede di assegnare ogni elemento nel markup come nuovo elemento della proprietà raccolta di supporto.

A livello di linguaggio XAML, i requisiti esatti del supporto della raccolta non sono completamente definiti. Il concetto che una raccolta può essere un elenco o un dizionario (ma non entrambi) è definito a livello di linguaggio XAML, ma quali tipi di supporto rappresentano elenchi o dizionari non è definito dal linguaggio XAML.

Nei servizi XAML .NET il concetto di supporto per la raccolta XAML è più chiaramente definito in termini di tipi di supporto .NET. In particolare, il supporto XAML per le raccolte si basa su diversi concetti e API .NET usati per elenchi e dizionari nella programmazione .NET generale.

  1. L'interfaccia IList indica una raccolta di elenchi.

  2. L'interfaccia IDictionary indica una raccolta di dizionari.

  3. Array rappresenta una matrice e una matrice supporta i IList metodi.

In ognuno di questi concetti di raccolta, un processore XAML di servizi XAML .NET prevede di chiamare il Add metodo su un'istanza specifica del tipo della proprietà della raccolta. In alternativa, in uno scenario di serializzazione, un processore XAML produce istanze di tipo XAML discrete per ogni elemento presente nell'elenco, nel dizionario o nella matrice in base al concetto specifico di "Items" di ogni raccolta. Questi elementi sono: IList.Item[]; IDictionary.Item[]; l'oggetto esplicito Array.IList.Item[] per Array.

Raccolte generiche

Le raccolte generiche possono essere utili per la programmazione .NET generale e possono essere usate anche per le proprietà della raccolta XAML. Tuttavia, le interfacce generiche IList<T> e IDictionary<TKey,TValue> non sono identificate dai processori XAML dei servizi XAML .NET come equivalenti al non generico IList o IDictionary. Anziché implementare le interfacce, un approccio consigliato per i tipi di proprietà della raccolta generica List<T> consiste nel derivare dalle classi o Dictionary<TKey,TValue>. Queste classi implementano le interfacce non generiche e includono quindi il supporto previsto per le raccolte XAML nell'implementazione di base.

Raccolte di sola lettura e logica di inizializzazione

Nella programmazione .NET è un modello di progettazione comune per creare qualsiasi proprietà che contenga un valore di una raccolta come raccolta di sola lettura. Questo modello consente all'istanza proprietaria della proprietà della raccolta di controllare meglio cosa accade alla raccolta. In particolare, il criterio impedisce la sostituzione accidentale dell'intera raccolta preesistente impostando la proprietà . In questo modello, qualsiasi accesso alla raccolta da parte dei chiamanti deve invece essere effettuato chiamando metodi o proprietà come supportati dal tipo di raccolta e/o dalle interfacce di raccolta pertinenti, ad IListesempio .

L'utilizzo di questo modello implica che qualsiasi classe che espone una proprietà di raccolta di sola lettura deve prima inizializzare tale proprietà per contenere una raccolta vuota. In genere l'inizializzazione viene eseguita come parte del comportamento di costruzione per la classe . Per essere utile per XAML, è importante che tale logica faccia sempre riferimento al costruttore senza parametri, perché XAML chiama in genere il costruttore senza parametri prima di elaborare le proprietà (proprietà della raccolta o altro).

Supporto e raccolte del sistema dei tipi XAML

Oltre ai meccanismi di base dell'analisi di XAML e del popolamento o della serializzazione delle proprietà della raccolta, il sistema di tipi XAML implementato nei servizi XAML .NET include diverse funzionalità di progettazione relative alle raccolte in XAML.

  1. IsCollection restituisce true se il tipo XAML è supportato da un tipo che fornisce supporto per la raccolta XAML.

  2. IsDictionary e IsArray può identificare ulteriormente la modalità raccolta supportata dal tipo XAML. Per i processori XAML personalizzati basati su servizi XAML .NET e sul sistema di tipi XAML, ma non basati sulle implementazioni esistenti XamlWriter , è necessario sapere quale modalità di raccolta viene usata per sapere quale metodo richiamare per l'elaborazione della raccolta.

  3. Ognuno dei valori delle proprietà precedenti è potenzialmente influenzato dagli override di LookupCollectionKind su un tipo XAML.