2008-11-24 2 views
7

Я реализую MVP/M-V-VM в WPF, и до сих пор мне повезло. Однако я не вижу, как эта модель поддерживает реализацию диалоговых окон Modal. Я получил свою работу от Crack.NET (http://www.codeplex.com/cracknetproject), чтобы узнать, как это работает.Модель-просмотр-презентатор и модальные диалоговые окна .... Как?

У меня есть представление ShellView (это просто XAML), на котором есть меню. Меню привязывается к команде в ShellModelView, которая говорит «EditPreferences».

ShellModelView реализует ICommand для EditPreferences, и здесь мы хотим установить диалоговое окно, позволяющее пользователю редактировать настройки для приложения.

Несколько проблем здесь: 1. ShellModelView не имеет ссылки на ShellView, чтобы правильно родительский диалог. ShellModelView - это DataContext для ShellView, но я не вижу настройки backreference. 2. ShellModelView не должен загружать явный пользовательский интерфейс в любом случае. Итак, какая здесь модель взаимодействия? 3. Как я могу создать свой PreferencesDialog так, чтобы он был правильно разделен между логикой и представлением? PreferencesDialog сам должен быть Окно, чтобы вы могли вызвать ShowDialog, но это означает, что вам нужна ссылка на Окно (например, View), чтобы создать экземпляр. В идеале я должен уметь тестировать код/​​валидацию в PreferencesDialog без создания экземпляра представления (возможно, с помощью Mock-просмотра?).

ответ

1

Вам понадобится контроллер в вашем случае. Контроллер должен отвечать за отображение диалогового окна настроек.

Как я могу себе представить, контроллер должен нести ответственность за создание DataContext оболочки ShellModelView и привязки к нему. Контроллер должен также нести ответственность за выполнение команды EditPreferences. В логике выполнения контроллер создаст новый PreferencesDialog и соответствующую модель представления.

Аналогичные модели вы можете найти в Prism, если вы еще этого не сделали. Вы также можете повторно использовать делегат-код, предоставленный там :)

6

Возможно, это не тот способ взглянуть на него, но это подход, который я принимаю с помощью M-V-VM в WPF. Открытие окон и диалоговых окон или представление «EditPreferences» - это специальные функции пользовательского интерфейса. Если бы я переписал весь ваш пользовательский интерфейс, заменив все виды, я могу завершить объединение «EditPreferences» с другим видом и поэтому не хочу открывать его на другом экране. Если бы это было связано с ViewModel, было бы трудно обойти. В этой конкретной ситуации у меня была бы кнопка или пункт меню в моем «ShellView», который создавал новый экземпляр моего представления «EditPreferences», а затем передавался в ViewModel «EditPreferences», который может либо поступать из свойства в моем «ShellViewModel» », или, возможно, мое представление« EditPreferences »создает экземпляр самой ViewModel.

Вот подобный вопрос на SO, что в принципе говорит то же самое: M-V-VM Design Question. Calling View from ViewModel

1

Имейте PreferencesDialog реализовать интерфейс, который является одним из свойств команды EditPreference. Команда будет взаимодействовать с диалогом через интерфейс. Для модульного тестирования объект mock вместо этого реализует интерфейс.

Тогда класс диалога может находиться на вашем самом высоком уровне.

+1

Я думал, что одна из целей MVVM является достижение не имея ViewModel знает вещь о View (или диалог в вашем примере)? Чтобы любое количество Views (или none) могло использовать ViewModel в любое время. Когда ваш ViewModel задает вещи на интерфейсе вида, это нарушает это. – 2009-08-11 06:13:37

0

Моего 2 цента:

  1. Проходит какое-то viewfactory контракта в качестве параметра команды или впрыснуть viewfactory контракта в модель представления.Модель представления будет использовать viewfactory для создания любых модальных/немодельных представлений, которые ему нужны. Viewfactory также может принимать в качестве параметра своего метода Show/ShowModal отображаемую модель. Кроме того, viewfactory может использовать таблицу данных для отображения любого viewmodal, переданного в качестве параметра.

  2. Добавить свойство ShowViewModel в рассматриваемую область просмотра. DataTrigger мог бы наблюдать за это имущество и когда конкретного типа показывает вид и т.д.

Смежные вопросы