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
ViewModelpotrebbe fare richiesta aMainWindowper creare / aggiungere / chiudereMidChildWindow,ChildWindow(da WPF Toolkit),Window(il tipo di finestra). -
ViewModelpuò ottenere ilDialogResultdalChildWindowdei suoi excutes. -
MainWindowha 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?