Come abbiamo visto nello script 20 (https://www.winrtitalia.com/script/20/Mostrare-Liste-Raggruppate-sControl-Windows-Store-App.aspx), ItemsControl è uno dei controlli di base per la costruzione delle interfacce; ad arricchire le sue funzionalità possiamo trovare la proprietà ItemTemplateSelector di tipo DataTemplateSelector.
Con ItemTemplateSelector possiamo impostare una classe che differenzi il DataTemplate da usare in base alla singola entità in binding.
Riprendendo la collezione e l'esempio dello script 20, utilizziamo in binding una collezione di oggetti Person che possiamo differenziare con un oggetto SpecialPerson da cui eredita.
public class Person { public string Name { get; set; } } public class SpecialPerson : Person { } //.. var people = new List<GroupedPeople> { new GroupedPeople() { GroupName = "Arcangeli", PeopleOfGroup = new List<Person>() { new Person() {Name = "Gabriele"}, new Person() {Name = "Jehudiel"}, new Person() {Name = "Michele"}, new Person() {Name = "Zerachiel"} } }, new GroupedPeople() { GroupName = "Evangelisti", PeopleOfGroup = new List<Person>() { new SpecialPerson() {Name = "Matteo"}, new SpecialPerson() {Name = "Marco"}, new SpecialPerson() {Name = "Luca"}, new SpecialPerson() {Name = "Giovanni"} } } };
Il polimorfismo supportato dal linguaggio non influenza il risultato, tuttavia in questo modo un DataTemplateSelector potrebbe controllare direttamente il tipo di oggetto ed applicare il giusto template.
public class SampleTemplateSelector : DataTemplateSelector { public DataTemplate Template1 { get; set; } public DataTemplate Template2 { get; set; } public DataTemplate Template3 { get; set; } protected override DataTemplate SelectTemplateCore(object item, DependencyObject container) { if (item is SpecialPerson) { if (((SpecialPerson)item).Name == "Luca") return Template3; return Template1; } else if (item is Person) { return Template2; } return base.SelectTemplate(item, container); } }
Nell'override di SelectTemplateCore, il DataTemplateSelector intercetta ogni singola entità in binding e restituisce lo specifico DataTemplate, anche in relazione ad una delle sue proprietà.
Possiamo valorizzare le proprietà DataTemplate del nostro SampleTemplateSelector nel markup tutte come StaticResource.
<Page.Resources> <DataTemplate x:Key="TP1"> <TextBlock Text="{Binding Name}" FontSize="20" Foreground="Green" /> </DataTemplate> <DataTemplate x:Key="TP2"> <TextBlock Text="{Binding Name}" FontSize="20" Foreground="Red" /> </DataTemplate> <DataTemplate x:Key="TP3"> <TextBlock Text="{Binding Name}" FontSize="40" FontStyle="Italic" Foreground="GreenYellow" /> </DataTemplate> <local:SampleTemplateSelector x:Key="SampleTemplateSelector" Template1="{StaticResource TP1}" Template2="{StaticResource TP2}" Template3="{StaticResource TP3}"/> </Page.Resources> <Grid Margin="120,100,0,0"> <ItemsControl ItemsSource="{Binding Source={StaticResource groupedItemsViewSource}}" ItemTemplateSelector="{StaticResource SampleTemplateSelector}"> ....
In questo modo il tutto è flessibile e ben gestibile anche a design time.

Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Recuperare la data di creazione e ultima modifica di un record con Entity Framework Core e le temporal table di SQL Server
Sviluppare applicazioni serverless con Azure Container Apps
Utilizzare i metodi Linq MinBy e MaxBy per semplificare le ricerche degli elementi minimi e massimi in liste di oggetti complessi con LINQ
Code generator con C#
Le novità di Entity Framework Core 6
Gestire gli errori in un servizio gRPC di ASP.NET Core
Creare convenzioni di mapping globali in Entity Framework Core
Utilizzare la parola chiave var con lambda eExpression e method group in C# 10
Ottimizzare il codice JavaScript con i Shorthand Patterns - prima parte
Ottimizzare le performance di serializzazione e deserializzazione JSON con System.Text.Json e i source generators
Entity Framework Core 6
Usare domini personalizzati con Azure Container App
I più letti di oggi
- Gestire form con più di un pulsante submit in ASP.NET MVC
- ecco tutte le novità pubblicate sui nostri siti questa settimana: https://aspit.co/wkly buon week-end!
- Costruire applicazioni native per ogni dispositivo con .NET e Visual Studio
- Usare TryUpdateModelAsync per aggiornare le entity nelle action di POST in ASP.NET Core MVC
- Creare un componente Button in Blazor per operazioni asincrone
- Invalidare un token JWT prima della scadenza con ASP.NET Core Identity
- Blazor PWA e Offline-First
- DateOnly e TimeOnly in .NET: e io che ci faccio?
- ecco tutte le novità pubblicate sui nostri siti questa settimana: https://aspit.co/wkly buon week-end!