В этом случае я бы предложил вам реализовать DialogService .Этот сервис, который вы можете внедрить в модель представления, для тестирования вам придется внедрить экземпляр, который не зависит от представления, тем самым поддерживая тестируемость.Вы можете использовать ViewModelLocator, чтобы сделать эту службу доступной для вашего приложения.
Другой подход заключается в реализации класса ViewBase, который реализует интерфейс, позволяющий отображать диалоговое окно.Этот интерфейс теперь используется ViewModel для отображения диалога.Опять же, для тестирования вам нужно предоставить другую реализацию интерфейса.Образец можно найти здесь .
Обе идеи вращаются вокруг одной и той же концепции выделения функции, которая показывает диалог.Для того чтобы строго разделить View и ViewModel, вам нужно подумать о том, как ViewModel определяет, какой диалог должен быть обработан, и как результат диалога или модель диалога возвращается вызывающей ViewModel.
Какой подход лучше, зависит от вашего суждения.Лично я предпочитаю первый подход, поскольку мне не нужно наследовать представления от общего базового класса.
PS: используйте команду, чтобы добраться до точки в вашей ViewModel, где вы хотите показать диалог.Использование диалогового сервиса не должно нуждаться в коде.