Con la proprietà ContentTemplate di un ContentControl possiamo impostare il DataTemplate per specificare la serie di controlli che visualizzeranno il contenuto.
L'utilità maggiore del DataTemplate è nell'ambito di data binding che possiamo sfruttare per renderizzare le informazioni sorgente con un aspetto ben definito.
Possiamo specificare il DataTemplate direttamente nel markup, oppure possiamo definirne come risorse dell'applicazione in modo del tutto analogo agli altri oggetti:
<UserControl.Resources> <DataTemplate x:Key="HorizontalTemplate"> <Grid> <Grid.ColumnDefinitions> <ColumnDefinition /> <ColumnDefinition /> </Grid.ColumnDefinitions> <TextBox Text="{Binding FirstName, Mode=OneWay}" /> <TextBox Text="{Binding LastName, Mode=OneWay}" Grid.Column="1" /> </Grid> </DataTemplate> <DataTemplate x:Key="VerticalTemplate"> <StackPanel Orientation="Vertical"> <TextBox Text="{Binding FirstName, Mode=OneWay}" /> <TextBox Text="{Binding LastName, Mode=OneWay}" /> </StackPanel> </DataTemplate> </UserControl.Resources>
Possiamo utilizzare i DataTemplate programmaticamente andando a valorizzare esplicitamente la proprietà ContentTemplate. Nel nostro esempio andiamo a gestire l'evento SelectionChanged della ListBox:
<ListBox x:Name="listBox" ItemsSource="{Binding Items}"> <ListBox.ItemTemplate> <DataTemplate> <TextBlock Text="{Binding FirstName, Mode=OneWay}" /> </DataTemplate> </ListBox.ItemTemplate> <i:Interaction.Triggers> <i:EventTrigger EventName="SelectionChanged"> <i:InvokeCommandAction Command="{Binding SelectedChangedCommand}" CommandParameter="{Binding SelectedItem, ElementName=listBox}" /> </i:EventTrigger> </i:Interaction.Triggers> </ListBox> <ContentControl x:Name="cc1" HorizontalContentAlignment="Stretch" HorizontalAlignment="Stretch" DataContext="{Binding SelectedItem, Mode=OneWay}"> <ContentPresenter /> </ContentControl>
Nell'execute del command corrispondente andiamo a recuperare la proprietà Template dell'oggetto sorgente e cerchiamo la risorsa corrispondente al nome:
SelectedChangedCommand = new GenericCommand<People>((item) => { SelectedItem = item; DataTemplate dataTemplate = this.Resources[item.Template] as DataTemplate; if (dataTemplate != null) { cc1.ContentTemplate = dataTemplate; } });
Recuperata la risorsa, valorizziamo la proprietà ContentTemplate con il DataTemplate corrispondente. Al click sul elemento avremo una grafica di dettaglio orizzontale o verticale.

Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Sfruttare gli embedding e la ricerca vettoriale con Azure SQL Database
Utilizzare EF.Constant per evitare la parametrizzazione di query SQL
Usare i settings di serializzazione/deserializzazione di System.Text.Json di ASP.NET all'interno di un'applicazione non web
Gestire progetti .NET + React in .NET Aspire
Migliorare l'organizzazione delle risorse con Azure Policy
Utilizzare l'espressione if inline in una pipeline di Azure DevOps
Conoscere il rendering Server o WebAssembly a runtime in Blazor
Loggare le query più lente con Entity Framework
Centralizzare gli endpoint AI Foundry con Azure API Management
Popolare una classe a partire dal testo, con Semantic Kernel e ASP.NET Core Web API
Persistere la ChatHistory di Semantic Kernel in ASP.NET Core Web API per GPT
Potenziare la ricerca su Cosmos DB con Full Text Search
I più letti di oggi
- Microsoft Security Bulletin MS02-061
- Da non perdere! I corsi online di ASPItalia.com
- DevOps in a .NET world
- Costruire un client HTTP tipizzato con Refit e IHttpClientFactory in ASP.NET Core 2.1
- Scambiare dati tra due server con SOAP: il client
- Il global.asa questo sconosciuto
- Ordinare le directory con FSO e disconnected recordset di ADO
- Sfruttare un assembly da più applicazioni ASP.NET senza utilizzare la GAC
- Usare Smart Navigation con ASP.NET
- Creare documenti Word con salto di pagina e proprietà avanzate