Ответ 1
Один из способов справиться с этим - реализовать службу, которая предоставляет Views для ViewModels. Регистры просмотров в сервисе и ViewModels могут запрашивать диалоги из службы. Это пример шаблона медиатора Gang of Four .
Я работаю над новым WPF-приложением, и я стараюсь оставаться как можно ближе к шаблону MVVM. Мои файлы XAML прямо сейчас не имеют кодовых имен, и вся моя интерактивность достигается с помощью класса и команд Josh Smith RelayCommand в классах ViewModel.
Это сработало отлично, пока я не начал работать над задачами домашнего хозяйства, например, о поле и странице настроек системы. Я хочу иметь их как модальные диалоги, но если я создам RelayCommand для открытия этих страниц, я создам зависимость от представления в моей модели представления.
Это поражает меня против зерна шаблона MVVM.
Существует ли установленный метод для создания новых окон (модальных и/или немодальных) в шаблоне MVVM без создания зависимости? Кажется, единственный способ сохранить чистку ViewModel в том, чтобы создать обработчик события Click в файле XAML codebehind и создать новое представление в старом представлении.
Любые рекомендации?
Один из способов справиться с этим - реализовать службу, которая предоставляет Views для ViewModels. Регистры просмотров в сервисе и ViewModels могут запрашивать диалоги из службы. Это пример шаблона медиатора Gang of Four .
Взгляните на мое решение Modal Dialogs для Silverlight 4:
Пожалуйста, см. мой ответ на этот вопрос о том, почему класс Window является ViewModel, поэтому вы можете использовать его непосредственно из ViewModel без проблем.
Лоран Бугнион имеет посредника с слабой ссылкой, в котором он использует его для отображения диалоговых сообщений. Наряду с сообщением, которое передается, делегат обратного вызова отправляется для выполнения подписчиком. Вы можете использовать ту же концепцию, чтобы показать диалог. Откроется диалоговое окно DialogMessage.cs из источника здесь.
Мы используем классы контроллера, которые отвечают за рабочий процесс пользовательского интерфейса. Они создают модальные окна, и они посредничают между различными ViewModels.
Как вы можете открыть модальное окно с шаблоном View-Model-ViewModel (MVVM), показано здесь в примере приложения ViewModel:
WPF Application Framework (WAF)