Я не вижу, как я могу открыть диалоговое окно, не вызывая его из моего CodeBehind или ViewModel.
Как правило, вы делаете это в коде - но большинство сред MVVM предоставляютспособ абстрагировать это.
Обычно это обрабатывается с помощью какой-либо формы расположения службы (т. е. путем внедрения ViewService или подобного) во ViewModel.Другим вариантом является использование какой-либо формы обмена сообщениями, которая является подходом MVVM Light.
Преимущество этих подходов состоит в том, что виртуальная машина может быть написана без знания View по-прежнему - вы меняете способвы пишете свой код так, чтобы команда (в ViewModel) вызывала какое-то событие, и для вас открывался правильный вид.Это удерживает зависимость View от вашего уровня VM.