54 messaggi dal 20 maggio 2009
Salve,

Dato che in WPF non c'è un MDI come in windows form, ho implementato la cosa con un tabControl, ovvero la MainWindow è una window wpf con un tabControl.

Ogni nuova finestra è una UserControl, quando devo aprire una finestra aggiungo a run-time un nuovo TabItem che ha come contenuto un contentControl al quale imposto come contenuto la UserControl della finestra che devo aprire.

Il tutto funziona abbastanza bene, però non riesco a creare un sistema di comunicazione tra il contenuto di un tab e la main window.

Nella Main Window ho inserito un menù, ogni pulsante del menù è gestito con i Comandi, quindi le properietà CanExecute dovrebbero tenere conto dello stato delle usercontrol.

Ad esempio In una usercontrol ho un datagrid con un elenco di contratti. nella main window ho il pulsante "Visualizza Dettaglio Contratto", che deve essere abilitato solo se una riga del DataGrid è selezionata. Quindi quando l'utente clicca su una riga del dataGrid dovrei in qualche modo comunicare dalla usercontrol alla main window "l'utente ha selezionato un contratto" e quindi abilitare il pulsante nella MainWindow "Visualizza Dettaglio Contratto".

Usando l'architettura ModelViewModel come posso implementare una cosa del genere ?

Vivaldi Francesco
Quello che stai chiedendo non è propriamente MVVM dato che dovresti rappresentare ogni tab con il suo ViewModel e mettere in una lista che è in binding poi sul TabControl. In questo modo non aggiunge la tab da codice nella view, ma lavori sempre a livello di ViewModel.
Di conseguenza anche la comunicazione dev'essere fatta tra ViewModel. Quello rappresentante la tab può semplicemente avere un riferimento al VM principale e invocare su di esso metodi che rappresentano il comando.
Per quello che chiedi inverti il senso. Fai che il VM principale monitorizza i VM figli in modo che lui sappia quando un'ipotetica proprietà SelectedContract cambia così lui può conoscere se è valido o meno e invalidare il comando.
Per questo genere di cose prova a guardare questo articolo http://www.winfxitalia.com/articoli/presentation-foundation/architettura-model-view-viewmodel-wpf-problemi-comuni.aspx

Ciao

Il mio blog
Homepage
54 messaggi dal 20 maggio 2009
Ciao,

Io ho un ViewModel per ogni Tab. Ogni Tab ha un Viewmodel e una View Xamal che è una UserControl.
La MainWindow invece è una window e da li tramite codice c# aggiungo i tab.

Quello a cui non ho pensato è creare una lista di Tab, in modo da aggiungere e rimuovere elementi dalla lista invece di aggiungere e rimuovere tab dal tabcontrol. E' un ottima idea ci proverò sicuramente.

Quindi se ho capito bene creo un BaseViewModel, da cui tutti gli altri ViewModel ereditano.

Poi nel BaseViewModel creo un ObservableCollection<TabItem> e bindo la collezzione al tabcontrol.

Per aggiungere un Tab aggiungo direttamente all'observableCollection.

Per gestire la comunicazione ho il baseViewModel che tutte le altre ViewMOdel conoscono perchè lo ereditano. mmm sembra semplice in teoria.

Oggi pomeriggio ci proverò.

Grazie delle info e del link veramente utile.

Vivaldi Francesco
54 messaggi dal 20 maggio 2009
Ciao,

sto provando ad implementare quanto mi ha suggerito, ma non riesco a capire bene come fare in modo che il VM contenitore monitorizzi i figli.

----
Fai che il VM principale monitorizza i VM figli in modo che lui sappia quando un'ipotetica proprietà SelectedContract cambia così lui può conoscere se è valido o meno e invalidare il comando.
-----

come può il VM principale sapere quando SelectedContract cambia ? deve essere il VM figlio a segnalare il cambio di stato ?


potresti farmi un esempio semplice ?

Vivaldi Francesco

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.
In primo piano

I più letti di oggi

Media
In evidenza
MISC