In alcuni script precedenti abbiamo visto come l'engine di data binding di Silverlight sia molto flessibile e comodo nella gestione dei dati.
Per semplificare maggiormente la gestione delle collezioni di dati sul client è stata introdotta la classe CollectionViewSource che ci permette di gestire i dati in binding con i controlli, senza la necessità di modificare la collezione di dati originali.
Per utilizzare la classe CollectionViewSource è sufficiente assegnare la collezione di dati alla proprietà Source: automaticamente viene valorizzata la proprietà View con un oggetto di tipo ICollectionView che possiamo utilizzare come sorgente dati per un ItemsControl.
Grazie ad ICollectionView abbiamo a disposizione una serie di funzionalità come la navigazione tra i dati, la sincronia tra elemento corrente della collezione ed elemento selezionato di un ItemsControl, la paginazione (lato client ovviamente), il raggruppamento, l'ordinamento ed il filtro dei dati.
Possiamo utilizzare l'oggetto direttamente da markup:
<UserControl.Resources> <local:Cars x:Key="cars" /> <CollectionViewSource Source="{Binding Source={StaticResource cars}}" x:Key="carsVs" Filter="CollectionViewSource_Filter"> </CollectionViewSource> </UserControl.Resources> <StackPanel> <TextBox x:Name="txb1" TextChanged="TextBox_TextChanged" /> <ListBox ItemsSource="{Binding Source={StaticResource carsVs}}" DisplayMemberPath="Name" /> </StackPanel>
Nel codice di esempio rendiamo disponibile la collezione sorgente come risorsa dello UserControl, la collezione Cars; di seguito definiamo la CollectionViewSource in cui specifichiamo come Source la collezione Cars come risorsa statica stessa. Già con questo semplice codice possiamo già utilizzare la CollectionViewSource ed associarla nell'espressione di binding del ListBox sottostante.
Per sfruttare ciò che CollectionViewSource può darci in più andiamo a gestirne l'evento Filter nel code behind, ed inseriamo una TextBox con un metodo gestore dell'evento TextChanged: durante l'inserimento dei caratteri vogliamo che nella ListBox vengano visualizzati solo gli elementi il cui nome inizia per la lettera digitata. Ecco il codice dell'evento Filter:
private void CollectionViewSource_Filter(object sender, System.Windows.Data.FilterEventArgs e) { if (txb1 != null) { Car item = e.Item as Car; if (item.Name.StartsWith(txb1.Text)) { e.Accepted = true; } else { e.Accepted = false; } } }
L'evento viene scatenato alla modifica della sorgente dati e viene eseguito per ogni elemento della collezione: nel codice è sufficiente definire ciò che rispetta o meno la regola di filtro valorizzando opportunamente la proprietà Accepted.
Infine, per scatenare la rivalutazione della collezione, è sufficiente chiamare il metodo Refresh di View nel metodo gestore dell'evento TextChanged:
private void TextBox_TextChanged(object sender, TextChangedEventArgs e) { CollectionViewSource carsVs = this.Resources["carsVs"] as CollectionViewSource; carsVs.View.Refresh(); }
Con questo semplice codice abbiamo aggiunto la funzionalità di filtro lato client ad una lista.
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Implementare l'infinite scroll con QuickGrid in Blazor Server
Supportare il sorting di dati tabellari in Blazor con QuickGrid
Gestire la cancellazione di una richiesta in streaming da Blazor
Sostituire la GitHub Action di login su private registry
Referenziare un @layer più alto in CSS
Utilizzare Tailwind CSS all'interno di React: primi componenti
Estrarre dati randomici da una lista di oggetti in C#
Eseguire un metodo asincrono dopo il set di una proprietà in Blazor 8
Testare l'invio dei messaggi con Event Hubs Data Explorer
Change tracking e composition in Entity Framework
Filtering sulle colonne in una QuickGrid di Blazor
Effettuare il log delle chiamate a function di GPT in ASP.NET Web API
I più letti di oggi
- Effettuare il log delle chiamate a function di GPT in ASP.NET Web API
- ecco tutte le novità pubblicate sui nostri siti questa settimana: https://aspit.co/wkly buon week-end!
- Utilizzare il metodo CountBy di LINQ per semplificare raggruppamenti e i conteggi
- Eseguire script pre e post esecuzione di un workflow di GitHub
- Creare una libreria CSS universale: Cards
- Migliorare l'organizzazione delle risorse con Azure Policy