Диалоговое окно «Модель-Представление-Презентатор» и «Модальное окно» .... Как? - PullRequest
7 голосов
/ 24 ноября 2008

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

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

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

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

Ответы [ 4 ]

6 голосов
/ 25 ноября 2008

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

Вот аналогичный вопрос о SO, который в основном говорит то же самое: Вопрос проектирования M-V-VM. Вид вызова из ViewModel

1 голос
/ 09 января 2009

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

Класс диалога может находиться на вашем верхнем слое.

1 голос
/ 24 ноября 2008

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

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

Подобные шаблоны можно найти в Prism , если вы еще этого не сделали. Вы также можете повторно использовать делегатную команду, представленную там:)

0 голосов
/ 20 ноября 2009

Мои 2 цента это:

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

  2. Добавьте свойство ShowViewModel к рассматриваемой модели представления. Затем DataTrigger может отслеживать это свойство, а когда оно имеет определенный тип, отображать представление и т. Д.

...