20 messaggi dal 30 maggio 2007
Salve, dopo un gratificante periodo d'uso di MVVM, mi sono dovuto scontrare con il problema della comunicazione tra viewmodel ed ho così pensato di utilizzare un mediator (perchè facile da utilizzare).
Per semplificare ho una struttura di questo tipo:
ContainerViewModel contiene ViewModels1 e ViewModels2; a loro volta ViewModels1 contiene una ObservableCollection di ViewModel1 e ViewModels2 una ObservableCollection di ViewModel2. ViewModel1 espone le proprietà bindabili Id, Model2Id, Description ecc, ViewModel2 espone le proprietà bindabili Id, Description.
Attraverso l'uso di template, nella view i contenitori sono ListBox e gli item stackpanel con textbox per la visualizzazione e l'editing tramite binding.
Dalla listbox che rappresenta ViewModels1, selezionando il valore Model2Id dell' item corrente devo far comparire la listbox ViewModels2 e, selezionando un item visualizzo nuovamente ViewModels1 con il valore Model2Id aggiornato.
Per far questo utilizzo un mediator condiviso tra i vari view model ma il codice è diventato estremamente complesso e difficile da mantenere (anche perchè mi sembra di richiedere al modelview di sobbarcarsi il compito che dovrebbe essere della view). Vorrei pertanto chiedere un qualche consiglio su come semplificare la comunicazione tra i vari view model.
Se serve posso postare un pò di codice di esempio
Credo che il problema risieda solo nel fatto che uso l'id e non direttamente un riferimento all'istanza del ViewModels2.
Se fai così non ti serve neanche il mediator dato che nella view puoi mettere in Binding la proprietà ViewModels2 del ViewModels1 attualmente selezionato. Il binding infatti permette di entrare in proprietà multi livello dell'elemento selezionato (occhio a IsSynchronizedWithCurrentItem)

Ciao

Il mio blog
Homepage
20 messaggi dal 30 maggio 2007
Prima di tutto ti ringrazio per la risposta. In effetti avevo pensato ad un approccio di questo tipo, ma mi sono scontrato con il problema che i vari view models non si conoscono e non conoscono il view model contenitore. Attualmente sono messo in questo modo

ContainerViewModel
(
Mediator mediator = new Mediator();
MyModel model = new MyModel();

private ViewModelsData1 data1 = New ViewModelsData1(mediator, model.Data1);
private ViewModelsData2 data2 = New ViewModelsData2(mediator, model.Data2);
private ViewModelsData3 data3 = New ViewModelsData3(mediator, model.Data3);
private ViewModelsData4 data4 = New ViewModelsData4(mediator, model.Data4);
private ViewModelsData5 data5 = New ViewModelsData5(mediator, model.Data5);
private ViewModelsData6 data6 = New ViewModelsData6(mediator, model.Data6);

.... //Altra roba
}

e nello xaml un tabcontrol (o un contentcontrol) che contiene le view (visualizzate come listbox) dei vari view models. Quando seleziono un item di uno di questi view model, entro in editing e posso modificare i valori (tramite binding). Alcuni di questi valori però sono id di item di altri view models (un pò come in un database) e, in questo caso, devo passare alla rispettiva view, selezionare l'item che voglio referenziare, e passare nuovamente alla view precedente. Come posso aggiornare la view del container da un view model senza un mediatore con il quale informare il contenitore che deve passare ad un' altra view? Avevo pensato di creare un'altra view per ogni tipo di view model solo per la selezione dei vari item da referenziare e visualizzarla magari come popup dal container, ma avrei dovuto scrivere molto codice in più per cose che il container in realtà già aveva (e solo per la view). Tra l'altro non riesco ad utilizzare un approccio tipo MVVM light (con un ViewModelLocator statico che mi permetta di passare da un model all'altro) perchè MyModel in realtà è un dispositivo connesso via usb, quindi posso avere da 0 a n ContainerViewModel

Modificato da andypat il 22 febbraio 2010 18.13 -

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.