Sto anche lavorando su un progetto MVVM in cui ho bisogno di finestre di dialogo modali o caselle di messaggio. Ho trovato il seguente modo di risolverlo:
Il software utilizza solo una finestra. L'elemento radice di layout è una griglia senza righe o colonnedefinizioni. La griglia ha tre figli:
- Un dockpanel che contiene tutte le solite cose come menu, viste a schede, barra di stato e così via.
- Una griglia con uno sfondo grigio e un'opacità del 50%. Viene utilizzato come velo per coprire il dockpanel quando è attiva una casella modale. La griglia del velo di solito è crollata.
- Una griglia che contiene visualizzazioni modali, di solito è compressa.
Il viewmodel per la finestra principale ha un membro chiamato Modal. Se questo è nullo, le due griglie per l'uso modale vengono compresse tramite il databinding e un convertitore per Visibility.Collapsed.
Quando il programma desidera visualizzare ad esempio una finestra di messaggio modale, un MessageBoxViewModel viene istanziato e assegnato a MainViewModel.Modal. MessageBoxViewModel ha un comando per un pulsante OK. Questo comando genera un evento che imposta nuovamente MainViewModel.Modal su null.
La griglia del velo occlude il DockPanel principale, in modo che nessun controllo esterno al controllo Modal accetti l'input.
Il tuo programma può eseguire un messagepump fino a quando viene premuto OK, oppure il comando OK può attivare il successivo. Esistono molti modi per risolvere esigenze diverse, ma la soluzione ModelView Model dovrebbe supportarli.
Ritengo che questo sia un buon modello della vista in modalità modale come si può sperare.
Forse ignorare qualche gestore OnvisibilityChanged nel code-behind della finestra di errore? – bluebit