Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - [VB.NET] WPF: databinding tra ObservableCollection(Of T), CollectionViewSource e ListView
Forum - C# / VB.NET - [VB.NET] WPF: databinding tra ObservableCollection(Of T), CollectionViewSource e ListView

Avatar
dedalux (Normal User)
Pro


Messaggi: 155
Iscritto: 14/02/2009

Segnala al moderatore
Postato alle 15:02
Sabato, 03/07/2010
Salve a tutti,
sto sviluppando un applicazione per la gestione delle fatture.
Funziona tutto a parte la visualizzazione della collezione delle fatture nella ListView.

Siccome ho bisogno di poter filtrare la fatture in base al fornitore (proprietà String di una fattura), ho deciso di organizzare la visualizzazione in questo modo:

creata nella MainWindow una proprietà Fatture di tipo ObservableCollection(Of Fattura)
carico dal database le fatture e le utilizzo per popolare la proprietà.

Da XAML ho creato nelle Window.Resources una CollectionViewSource, la cui proprietà Source punta a Fatture (proprietà della MainWindow)

La proprietà ItemsSource della mia ListView va a puntare alla CollectionViewSource.

Volendo fare un semplice schema, Fatture <---CollectionViewSource <----ListView

Code behind
Codice sorgente - presumibilmente C# / VB.NET

  1. Public Property Fatture As ObservableCollection(Of Fattura) = CaricaFatture()



Codice sorgente - presumibilmente C# / VB.NET

  1. Function CaricaFatture() As ObservableCollection(Of Fattura)
  2.         '......
  3.     End Function




lato XAML

- la CollectionViewSOurce
Codice sorgente - presumibilmente Plain Text

  1. Window.Resources>
  2.         <CollectionViewSource x:Key="cvsFatture" Source="{Binding ElementName=wdw_DSM, Path=Fatture}" />
  3.     </Window.Resources>



- e la ListView
Codice sorgente - presumibilmente C# / VB.NET

  1. <ListView x:Name="lswFatture" ItemsSource="{Binding Source={StaticResource cvsFatture}}">
  2.                                 <ListView.View>
  3.                                         <GridView>
  4.                         <!-- Colonne con i relativi DisplayMemberBnding-->
  5.                     </GridView>
  6.                                 </ListView.View>
  7.                 </ListView>




Al load della form non visualizza nulla nella lista, però se chiedo
Codice sorgente - presumibilmente Plain Text

  1. MessageBox.Show(Fatture.Count & ", " & lswFatture.Items.Count)



mi risponde: 20, 0

qualcuno è in grado di aiutarmi? :(
grazie gente! :k:

Ultima modifica effettuata da dedalux il 03/07/2010 alle 19:55


«La disumanità del computer sta nel fatto che, una volta programmato e messo in funzione, si comporta in maniera perfettamente onesta.»

Isaac Asimov
PM Quote
Avatar
netarrow (Admin)
Guru^2


Messaggi: 2502
Iscritto: 12/05/2004

Segnala al moderatore
Postato alle 21:07
Sabato, 03/07/2010
Per la tua implementazione come tentativo ti suggerisco di modificare questa riga:

Codice sorgente - presumibilmente Plain Text

  1. ItemsSource="{Binding Source={StaticResource cvsFatture}}"



con

Codice sorgente - presumibilmente Plain Text

  1. ItemsSource="{Binding Source={DynamicResource cvsFatture}}"



Ad ogni modo ti allego un piccolo esempio di ListView che mostra una GridView filtrabile per un campo. L'esempio usa il pattern Model-View-ViewModel

L'esempio è però in C# (vb.net non lo so), ma è sempre .NET, sempre WPF; dovresti riuscire a leggerlo e capire come rifarlo in vb.net.

Al limite puoi usare uno di quei traduttori automatici che ci sono per trasformare C# in vb.net.


netarrow ha allegato un file: ProvaWPF.zip (67749 bytes)
Clicca qui per scaricare il file



Mai memorizzare quello che puoi comodamente trovare in un libro.
Imparare è un'esperienza; tutto il resto è solo informazione.
L'immaginazione è più importante della conoscenza.
(A. Einstein)


Esistendo poi google...
PM Quote
Avatar
dedalux (Normal User)
Pro


Messaggi: 155
Iscritto: 14/02/2009

Segnala al moderatore
Postato alle 17:28
Domenica, 04/07/2010
Grazie Netarrow.
Come esempio avevo trovato anche questo http://code.msdn.microsoft.com/Project/Download/FileDownlo ... esempio, e stavo appunto cercando di riprodurlo all'interno del mio progetto, ma senza risultato.

Ho guardato il tuo esmpio Netarrow, appena finisco di convertire il codice, che in un punto mi da un errore, ti faccio sapere se ho risolto. Intanto, finche non posso provarci da solo, ti chiedo: se avessi bisogno di filtrare le fatture in base ad una qualsiasi proprietà?

grazie

Ultima modifica effettuata da dedalux il 04/07/2010 alle 17:30


«La disumanità del computer sta nel fatto che, una volta programmato e messo in funzione, si comporta in maniera perfettamente onesta.»

Isaac Asimov
PM Quote
Avatar
netarrow (Admin)
Guru^2


Messaggi: 2502
Iscritto: 12/05/2004

Segnala al moderatore
Postato alle 19:13
Domenica, 04/07/2010
basterebbe aggiungere altri TextBox per gli altri campi, sui quali applichi un Binding in modalità OneWayToSource verso delle proprietà del ViewModel tramite le quali filtrerai la proprietà Fatture (al momnto il filtro viene fatto con una query linq, nel tuo caso reale probabilmente avrai dei metodi che ti faranno fare query sul DB).

Potresti anche implementare in maniera generalizzata una GridView filtrabile che automaticamente rende filtrabili le colonne, oppure cerchi un componente di terzi che già implementa funzionalità avanzate sulle griglie.




Mai memorizzare quello che puoi comodamente trovare in un libro.
Imparare è un'esperienza; tutto il resto è solo informazione.
L'immaginazione è più importante della conoscenza.
(A. Einstein)


Esistendo poi google...
PM Quote
Avatar
dedalux (Normal User)
Pro


Messaggi: 155
Iscritto: 14/02/2009

Segnala al moderatore
Postato alle 19:33
Domenica, 04/07/2010
Per caso hai dato un'occhiata all'esempio dell'MSDN?


«La disumanità del computer sta nel fatto che, una volta programmato e messo in funzione, si comporta in maniera perfettamente onesta.»

Isaac Asimov
PM Quote