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