È necessario un suggerimento per la progettazione di più applicazioni Windows

1

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

  1. Qualsiasi ViewModel potrebbe fare richiesta a MainWindow per creare / aggiungere / chiudere MidChildWindow , ChildWindow (da WPF Toolkit), Window (il tipo di finestra).
  2. ViewModel può ottenere il DialogResult dal ChildWindow dei suoi excutes.
  3. 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?

    
posta King Chan 07.02.2012 - 19:31
fonte

1 risposta

2

Invece di provare a utilizzare un Guid o HashKey, potresti trovare più semplice utilizzare effettivamente un riferimento agli oggetti ChildWindow.

Inoltre, al fine di prevenire perdite di memoria, senza doversi preoccupare di gestire gli eventi, puoi utilizzare un riferimento debole all'oggetto in modo che il garbage collector possa ancora recuperare le risorse utilizzate dall'oggetto quando non viene più fatto riferimento in alcun luogo.

Ho trovato che le seguenti classi .NET sono piuttosto utili quando si lavora con riferimenti deboli:

Inoltre, puoi avere ciascuna ChildWindow che imposta DataContext sul proprio ViewModel appropriato, in modo dichiarativo all'interno di XAML o nel code-behind.

Modifica

Inoltre, ho pensato di chiarire che se si utilizza una raccolta di WeakReference per tenere traccia di ogni finestra, non è necessario rimuovere manualmente il riferimento dalla raccolta ogni volta che si chiude una finestra. Puoi semplicemente chiudere la finestra (sia dal code-behind, sia da qualsiasi altra parte) & non pensarci più: il GC distribuirà automaticamente le risorse necessarie.

    
risposta data 03.11.2012 - 19:37
fonte

Leggi altre domande sui tag