Alessandro Del Sole's Blog

{ A programming space about Microsoft® .NET® }
posts - 1909, comments - 2047, trackbacks - 352

My Links

News

Your host

This is me! Questo spazio è dedicato a Microsoft® .NET®, di cui sono molto appassionato :-)

Cookie e Privacy

Microsoft MVP

My MVP Profile

Microsoft Certified Professional

Microsoft Specialist

Xamarin Certified Mobile Developer

Il mio libro su VB 2015!

Pre-ordina il mio libro su VB 2015 Pre-ordina il mio libro "Visual Basic 2015 Unleashed". Clicca sulla copertina per informazioni!

Il mio libro su WPF 4.5.1!

Clicca sulla copertina per informazioni! E' uscito il mio libro "Programmare con WPF 4.5.1". Clicca sulla copertina per informazioni!

These postings are provided 'AS IS' for entertainment purposes only with absolutely no warranty expressed or implied and confer no rights.
If you're not an Italian user, please visit my English blog

Le vostre visite

I'm a VB!

Guarda la mia intervista a Seattle

Follow me on Twitter!

Altri spazi

GitHub
I miei progetti open-source su GitHub

Article Categories

Archives

Post Categories

Image Galleries

Privacy Policy

WPF: un metodo extension per convertire in ObservableCollection(Of T)

UPDATE NEL CODICE DEL 16.02.2009

Quando dobbiamo utilizzare il data-binding nelle applicazioni Windows Presentation Foundation, la collezione più indicata per rappresentare i nostri dati è la ObservableCollection(Of T) poiché ci permette di porre in essere il cosiddetto data-binding "two ways", in particolare le modifiche fatte sulla collezione si riflettono sull'interfaccia in modo automatico (implementando INotifyPropertyChanged) e supporta l'aggiunta, la rimozione e la modifica dei dati.

Spesso può capitare di voler recuperare dati tramite LINQ, da collegare poi all'interfaccia. LINQ, però, restituisce tipicamente IEnumerable(Of T) o IQueryable(Of T), che deriva dalla IEnumerable e non offre la possibilità di convertire questo tipo in una ObservableCollection se non mediante la scrittura di apposito codice, ad esempio mediante iterazione.

Per rendere più elegante la conversione, possiamo creare un metodo extension personalizzato. Ricordando che la ObservableCollection è definita nell'assembly WindowsBase.dll, quindi se volete utilizzare il metodo in applicazioni non WPF dovrete referenziarlo a mano, possiamo scrivere il seguente codice:

Imports System.Runtime.CompilerServices

Imports System.Collections.ObjectModel

 

...

 

<Extension()> Module Extensions

 

    ''' <summary>

    ''' Converts a generic System.Collections.Generic.IEnumerable(Of T) to a generic System.Collections.ObjectModel.ObservableCollection(Of T)

    ''' </summary>

    ''' <typeparam name="T"></typeparam>

    ''' <param name="MyCollection"></param>

    ''' <returns></returns>

    ''' <remarks></remarks>

    <Extension()> Function ToObservableCollection(Of T)(ByVal MyCollection As IEnumerable(Of T)) As  _

                ObservableCollection(Of T)

 

        Try

            Dim c As New ObservableCollection(Of T)(MyCollection)

 

            Return c

        Catch ex As Exception

            Throw New NotSupportedException(ex.InnerException.Message)

        End Try

    End Function

End Module

Il costruttore della ObservableCollection espone tre overload, uno senza argomenti, uno che riceve una List(Of T) e uno che riceve una IEnumerable(Of T). Ciò premesso, ci basta passare al costruttore proprio l'IEnumerable che vogliamo convertire per popolare automaticamente la collezione. Nel caso di errori, solleviamo una NotSupportedException che rimanderà al chiamante il compito di gestire l'eccezione stessa. L'utilizzo del commento XML permetterà all'Intellisense di visualizzare una tooltip descrittiva del metodo stesso. Un piccolo esempio d'uso:

        Dim runningProcesses = Process.GetProcesses.AsEnumerable

 

        Dim observableProcess = runningProcesses.ToObservableCollection

 

        For Each p In observableProcess

            Console.WriteLine(p.ProcessName)

        Next

in questo modo abbiamo ottenuto l'elenco dei processi attivi, convertito in ObservableCollection(Of Process), come potete osservare passando il puntatore del mouse sulla dichiarazione della variabile il cui tipo è stato inferito dal compilatore, e iterato la collezione al fine di ottenere il risultato desiderato.

Potremmo per esempio utilizzare il metodo per ottenere un elenco di prodotti dal modello a oggetti LINQ to SQL o Entity Framework, convertirlo in ObservableCollection, collegarlo all'interfaccia, eseguire le modifiche direttamente sulla collezione per avere l'interfaccia automaticamente aggiornata.

Alessandro

Print | posted on lunedì 16 febbraio 2009 20:51 | Filed Under [ Visual Basic Windows Presentation Foundation ]

Powered by:
Powered By Subtext Powered By ASP.NET