Ci sono due buoni modi per farlo, 1) un servizio di dialogo (facile, pulito) e 2) vista assistita. View assisted fornisce alcune funzioni pulite, ma di solito non ne vale la pena.
SERVIZIO DI DIALOGO
a) un'interfaccia del servizio di dialogo come tramite il costruttore o un contenitore di dipendenze:
interface IDialogService
{
Task ShowDialogAsync(DialogViewModel dlgVm);
}
b) L'implementazione di IDialogService dovrebbe aprire una finestra (o immettere un controllo nella finestra attiva), creare una vista corrispondente al nome del tipo dlgVm specificato (utilizzare la registrazione o la convenzione del contenitore o un ContentPresenter con i DataTemplates associati al tipo). ShowDialogAsync dovrebbe creare un TaskCompletionSource e restituire la sua elica .Task. La stessa classe DialogViewModel necessita di un evento che è possibile richiamare nella classe derivata quando si desidera chiudere e guardare nella vista della finestra di dialogo per chiudere / nascondere effettivamente la finestra di dialogo e completare TaskCompletionSource.
b) Per usare, chiama semplicemente waitit this.DialogService.ShowDialog (myDlgVm) sulla tua istanza di una classe derivata da DialogViewModel. Dopo aver atteso i ritorni, guarda le proprietà che hai aggiunto nella finestra di dialogo VM per determinare cosa è successo; non hai nemmeno bisogno di una richiamata.
VISUALIZZAZIONE ASSISTITA
Questo ti consente di ascoltare un evento sul modello di visualizzazione. Tutto ciò potrebbe essere racchiuso in un comportamento misto per evitare il codice e l'utilizzo delle risorse se sei così incline (FMI, sottoclasse la classe "Comportamento" per vedere una sorta di proprietà collegata miscelabile sugli steroidi). Per ora, lo faremo manualmente su ogni vista:
a) Creare un OpenXXXXXDialogEvent con un payload personalizzato (una classe derivata da DialogViewModel).
b) Far iscrivere la vista all'evento nel suo evento OnDataContextChanged. Assicurati di nascondere e annullare l'iscrizione se il vecchio valore! = Null e nell'evento Unloaded di Window.
c) Quando l'evento si attiva, tieni la vista aperta, che potrebbe trovarsi in una risorsa sulla tua pagina, oppure potresti trovarla per convenzione altrove (come nell'approccio del servizio di dialogo).
Questo approccio è più flessibile, ma richiede più lavoro da utilizzare. Non lo uso molto. L'unico vantaggio è la possibilità di posizionare fisicamente la vista all'interno di una scheda, ad esempio. Ho usato un algoritmo per posizionarlo nei limiti del controllo utente corrente o, se non abbastanza grande, attraversare l'albero visivo fino a trovare un contenitore abbastanza grande.
Ciò consente alle finestre di dialogo di essere vicine al luogo in cui vengono effettivamente utilizzate, di oscurare solo la parte dell'app correlata all'attività corrente e di consentire all'utente di spostarsi all'interno dell'app senza dover spostare manualmente le finestre di dialogo, anche con più quasi- le finestre di dialogo modali si aprono su diverse schede o viste secondarie.