Я также работаю над проектом MVVM, где мне нужны модальные диалоговые окна или ящики сообщений. Я нашел следующий способ ее решения:
Программное обеспечение использует только одно окно. Корневым элементом макета является Grid без определений строк или столбцов. Сетка имеет трех детей:
- Док-панель, содержащая все обычные элементы, такие как меню, представления с вкладками, строка состояния и т. Д.
- Сетка с серым фоном и непрозрачностью 50%. Это используется в качестве завесы, чтобы закрыть панель док-станции, когда действует модальная коробка. Сетка завесы обычно рушится.
- Сетка, удерживающая модальные виды, обычно она сворачивается.
В viewmodel для главного окна есть элемент с именем Modal. Если это значение равно null, две сетки для модального использования сворачиваются посредством привязки данных и конвертера для Visibility.Collapsed.
Когда программа хочет отобразить, например, модальное окно сообщения, создается экземпляр MessageBoxViewModel, который присваивается MainViewModel.Modal. MessageBoxViewModel имеет команду для кнопки ОК. Эта команда вызывает событие, которое снова устанавливает значение MainViewModel.Modal в значение null.
Сетка завесы закрывает основную панель DockPanel, поэтому никакие элементы управления вне модального элемента управления не принимают входные данные.
Ваша программа может запускать помпу до тех пор, пока не будет нажата кнопка OK, или команда OK может вызвать следующую. Существует много способов решения различных задач, но решение Model-ModelView должно их поддерживать.
Я чувствую, что эта модель вида в модальном режиме настолько хороша, насколько можно надеяться.