Мне нравится подход, описанный в этой статье:
http://www.codeproject.com/KB/WPF/XAMLDialog.aspx
В основном он создает элемент управления WPF Dialog, который может быть встроен в визуальное дерево другого окна или пользовательского элемента управления.
Затем используется триггер стиля, который заставляет диалоговое окно открываться всякий раз, когда в диалоге есть содержимое.
так что в xaml все, что вам нужно сделать, это (где DialogViewModel - это свойство вашей ViewModel):
<MyControls:Dialog Content = {Binding DialogViewModel}/>
и в вашей ViewModel вам просто нужно сделать следующее:
DialogViewModel = new MyDialogViewModel();
так что в модульном тестировании все, что вам нужно сделать, это:
MyViewModel model = new MyViewModel();
model.DialogViewModel = new MyDialogViewModel();
model.DialogViewModel.InputProperty = "Here's my input";
//Assert whatever you want...
Я лично создаю свойство ICommand в моем ViewModel, которое устанавливает свойство DialogViewModel, чтобы пользователь мог нажать кнопку, чтобы открыть диалоговое окно.
Так что моя ViewModel никогда не вызывает диалог, он просто создает свойство. Представление интерпретирует это и отображает диалоговое окно. Вся прелесть в том, что если вы решите вообще изменить свое представление и, возможно, не отобразить диалоговое окно, вашей ViewModel не нужно менять один бит. Он выталкивает весь код взаимодействия с пользователем туда, где он должен быть ... в представлении. И создание элемента управления wpf позволяет мне повторно использовать его всякий раз, когда мне нужно ...
Есть много способов сделать это, я нашел, что это хорошо для меня. :)