Вероятно, уже очень поздно, но я столкнулся с той же проблемой и нашел решение, которое работает для меня.
Я не могу понять, как создать приложение без диалогов (возможно, это просто блок разума). Так что я был в тупике с MVVM и показывал диалог. Итак, я наткнулся на эту статью CodeProject:
http://www.codeproject.com/KB/WPF/XAMLDialog.aspx
Это пользовательский элемент управления, который в основном позволяет окну находиться в визуальном дереве другого окна (не разрешено в xaml). Он также предоставляет логическое свойство DependencyProperty под названием IsShowing.
Вы можете установить стиль, как правило, в Resourcedictionary, который в основном отображает диалог всякий раз, когда свойство Content элемента управления! = Null с помощью триггеров:
<Style TargetType="{x:Type d:Dialog}">
<Style.Triggers>
<Trigger Property="HasContent" Value="True">
<Setter Property="Showing" Value="True" />
</Trigger>
</Style.Triggers>
</Style>
В представлении, в котором вы хотите отобразить диалоговое окно, просто введите:
<d:Dialog Content="{Binding Path=DialogViewModel}"/>
И в вашей ViewModel все, что вам нужно сделать, это установить для свойства значение (Примечание: класс ViewModel должен поддерживать INotifyPropertyChanged, чтобы представление могло знать, что что-то произошло).
вроде так:
DialogViewModel = new DisplayViewModel();
Чтобы сопоставить ViewModel с View, у вас должно быть что-то подобное в ресурсе:
<DataTemplate DataType="{x:Type vm:DisplayViewModel}">
<vw:DisplayView/>
</DataTemplate>
При всем этом вы получаете однострочный код для отображения диалога. Проблема, которую вы получаете, заключается в том, что вы не можете закрыть диалоговое окно только с помощью приведенного выше кода. Вот почему вы должны поместить событие в базовый класс ViewModel, от которого наследуется DisplayViewModel, и вместо приведенного выше кода напишите это
var vm = new DisplayViewModel();
vm.RequestClose += new RequestCloseHandler(DisplayViewModel_RequestClose);
DialogViewModel = vm;
Затем вы можете обработать результат диалога с помощью обратного вызова.
Это может показаться немного сложным, но как только закладывается фундамент, все довольно просто. Опять же, это моя реализация, я уверен, что есть и другие:)
Надеюсь, это поможет, это спасло меня.