Newsgroup: it.comp.dotnet
Titolo: VB, ListBox e template

Ciao a tutti,
sto muovendo i primi passi con Wpf, con un controllo hostato su una winform.
Questo controllo contiene solo una ListBox, che, tramite un template e 
DataBinding, mostra il contenuto di alcuni oggetti di tipo "Scatola".
Ammettiamo quindi uno scenario del genere..
Ho un furgone che contiene una lista (List (of Scatola)), passo questa lista 
al controllo che contiene la ListBox, trasformo la lista in una 
System.Collections.ObjectModel.ObservableCollection (of Scatola), e assegno 
questa nuova lista alla proprieta' ItemSource della mia ListBox.
Fin qui tutto ok :-)
Il problemino che ho e' quello di visualizzare le eventuali modifiche che 
vengono effettuate all'interno del furgone (aggiunta o eliminazione di 
scatole).
Attualmente ho il furgone che alza un evento per segnalare le modifiche, 
quindi, vado ad eliminare tutti gli item della ListBox, riassegno la nuova 
lista delle scatole al controllo con la ListBox e quindi tutto il processo 
riparte.
Questa soluzione pero' rallenta un po' la visualizzazione della lista, con 
un inevitabile refresh della lista stessa e con il primo item della lista 
che viene visualizzato, indipendentemente dalla posizione precedente (mi 
sono spiegato? ... boh).
C'e' un modo per aggiungere (o eliminare) un item in maniera dinamica senza 
dover ricaricare la lista?
Naturalmente fermo restando che il nuovo item (in caso abbia aggiunto una 
scatola nel furgone) dovra' rappresentare la scatola tramite il template 
costruito.
Dovrei abbandonare del tutto il binding e gestire tutto a manina?
Spero di essere stato chiaro, grazie a chi avra' la pazienza di rispondermi.

 Dovrei abbandonare del tutto il binding e gestire tutto a manina?
Se non ho capito male, � proprio col binding che dovresti affrontare la 
cosa, dipende cosa hai "bindato" all'itemssource della listbox:
se ci hai bindato una collection specifica, tipo ObservableCollection, 
hai tutto quello che ti serve perch� gi� implementa la 
INotifyCollectionChanged (che � l'interfaccia che serve a te visto che 
fai aggiunte e rimozioni di scatole), dunque ti basta fare binding tra 
l'ItemsSource della listbox e la collection suddetta e le modifiche alla 
collection ti si riflettono automaticamente sul componente.
Se invece hai una collection pi� semplice, tipo List, devi implementare 
la INotifyCollectionChanged da solo. Ecco un esempio pi� chiaro di 
quello che ho scritto io, dove spiega che per fare binding a controlli 
di tipo itemscontrol la collection, quale che sia, deve implementare 
IEnumerable, IEnumerator, INotifyCollectionChanged (ObservableCollection 
le implementa tutte):
http://social.msdn.microsoft.com/forums/en-US/wpf/thread/7b14a18f-2ed6-4713-b747-9defd05978dd/

 spiegato? ... boh).
in soldoni stai applicando un rudimentale m-v-vm. Il giro dell'evento ï¿œ 
quello giusto ma devi essere un filo piï¿œ sofisticato e capire quali 
sono le differenze tra le due collection in modo da sincronizzarle e 
non brutalmente fare la clear+fill della ObservableCollection<>
ï¿œ abbastanza banale scriversi un metodo che faccia il sync tra due 
liste, se non vuoi usare direttamente Radical, lo puoi scroccare qui:
http://radical.codeplex.com/SourceControl/changeset/view/66579#798757
.m
-- 
Mauro Servienti
{C67C0157-5D98-4733-A75E-93CAEE4BADC8}
Microsoft MVP - Visual C# / MCTS
http://mvp.support.microsoft.com/profile/mauro
blog @ 
http://milestone.topics.it
whynot [ at ] topics [ dot ] it

devi essere un filo piï¿œ sofisticato e capire quali
sono le differenze tra le due collection in modo da sincronizzarle e
non brutalmente fare la clear+fill della ObservableCollection<>
...
Ok, quindi se ho capito bene quello che mi suggerisce Mauro, quando ricevo 
un evento dalla lista List(of Scatola), devo resincronizzare la 
System.Collections.ObjectModel.ObservableCollection (of Scatola) generata 
dalla lista List(of Scatola) con la generatrice stessa, in quanto le 
modifiche fatte alla prima, non si riflettono sulla seconda, giusto?
A questo punto, le modifiche fatte sulla 
System.Collections.ObjectModel.ObservableCollection (of Scatola) si 
riflettono anche sulla mia ListBox.
Ho fatto un po' di prove anche con quello che ha suggerito marcosabba, ed 
effettivamente utilizzando da subito una 
System.Collections.ObjectModel.ObservableCollection (of Scatola), le 
modifiche fatte vengono riportate anche sulla listitem, il problema e' che 
mi sarebbe molto complicato andare a cambiare la mia lista List(of Scatola) 
con una System.Collections.ObjectModel.ObservableCollection (of Scatola).

 una System.Collections.ObjectModel.ObservableCollection (of Scatola).
inoltre hai il problema "filosofico" che legheresti il tuo modello a 
WPF perchï¿œ in soldoni il tuo modello non ha bisogno di una 
ObservableCollection ï¿œ WPF che ne ha bisogno.
Una domanda perï¿œ: ï¿œ abbastanza curioso che il modello, direttamente il 
modello, faccia push di variazioni verso la UI, puoi spiegare meglio i 
dettagli del tuo scenario per capire se ci sono strade migliori oltre 
alla sincronizzazione tra liste?


Una domanda perï¿œ: ï¿œ abbastanza curioso che il modello, direttamente il
modello, faccia push di variazioni verso la UI, puoi spiegare meglio i
dettagli del tuo scenario per capire se ci sono strade migliori oltre
alla sincronizzazione tra liste?
...
Non ho ben capito il dubbio, comunque faccio un piccolo riassuntino di cio' 
che faccio.
Ho il mio oggetto di tipo "Furgone" che contiene degli oggetti di tipo 
"Scatola", tramite la ListBox mostro all'utente la disposizione delle 
scatole all'interno del furgone.
La mia UI ha vari menu, buttonbox e funzioni di Drag&Drop per poter 
aggiungere, eliminare o spostare le scatole all'interno del furgone.
Naturalmente la UI "dice" all'oggetto furgone che tipo di operazioni 
effettuare sulle scatole, ed e' la classe Furgone a sapere come muovere, 
aggiungere o eliminare le scatole stesse.
Il furgone espone all'esterno la lista List (of Scatola), ma solo per far 
conoscere alla UI il contenuto del furgone stesso, ed inoltre espone un 
evento  che viene alzato quando il contenuto della lista di scatole cambia 
(anche solo per l'ordine delle scatole stesse).
Quale altro approccio potrebbe esserci?
Ciao e grazie... Maurizio

 Quale altro approccio potrebbe esserci?
detta così è chiara e va bene l'evento che cmunichi le variazioni e le 
"differenze".


detta cosï¿œ ï¿œ chiara e va bene l'evento che cmunichi le variazioni e le
"differenze".
...
Oh, beh, allora ogni tanto ne "azzecco" qualcuna anche io :-)
Grazie di tutto!