Questo è stato precedentemente pubblicato in StackOverflow, mi sono appena trasferito qui ...
Sto usando VS2008, MVVM, WPF, Prism per creare un'applicazione CRM per finestre mutiple.
Sto usando MidWinow
nel mio MainWindow
, voglio
- Qualsiasi
ViewModel
potrebbe fare richiesta aMainWindow
per creare / aggiungere / chiudereMidChildWindow
,ChildWindow
(da WPF Toolkit),Window
(il tipo di finestra). -
ViewModel
può ottenere ilDialogResult
dalChildWindow
dei suoi excutes. -
MainWindow
ha il controllo su tutti i tipi di finestre aperte.
Ecco il mio approccio attuale:
Ho creato Dictionary
di ciascun tipo di finestra e li ho memorizzati nella classe MainWindow.
Per 1, vale a dire in CustomerInformationView
, il suo CustomerInformationViewModel
può eseguire EditCommand
e usare EventAggregator
per dire a MainWindow di aprire un nuovo ChildWindow
.
CustomerInformationViewModel:
CustomerEditView ceView = new CustomerEditView ();
CustomerEditViewModel ceViewModel = CustomerEditViewModel ();
ceView.DataContext = ceViewModel;
ChildWindow cWindow = new ChildWindow();
cWindow.Content = ceView;
MainWindow.EvntAggregator.GetEvent<NewWindowEvent>().Publish(new WindowEventArgs(ceViewModel.ViewModeGUID, cWindow ));
cWindow.Show();
Notare che tutto il mio ViewModel
genererà un Guid
per help identifica il ChildWindow
dal dizionario di MainWindow
. Dal momento che userò solo 1 View Viewmodel per ogni finestra.
Per 2. In CustomerInformationViewModel
Riesco ad ottenere DialogResult
da OnClosing
evento da ChildWindow
, in CustomerEditViewModel
puoi usare Guid
per dire a MainWindow di chiudere ChildWindow.
Ecco alcune piccole domande e problemi:
È una buona idea usare Guid qui? O dovrei usare HashKey da ChildWindow?
Il mio MainWindows
contiene raccolte di riferimenti Windows. Quindi, ogni volta che la finestra si chiude, riceverà una notifica di rimozione dalla raccolta da OnClosing
evento. Ma tutta la stessa Windows non conosce il suo Guid associato, quindi quando lo rimuovo, devo cercare ogni KeyValuePair per confrontare ...
Ancora mi sento in qualche modo sbagliato ad associare il Guid di ViewModel per ChildWindow, avrebbe più senso se ChildWindow ha il suo ID personale, quindi ViewModel lo associa ...
Ma, cosa più importante, c'è un approccio migliore su questo design? Come posso migliorare meglio?