M-V-VM Вопрос проектирования. Вызов View из ViewModel - PullRequest
18 голосов
/ 19 ноября 2008

Я только начал изучать M-V-VM для приложения WPF. Пока что все имеет смысл, кроме этой конкретной проблемы ...

У меня есть ViewModel, которую я назову Search. Эта ViewModel привязывается к сетке данных и перечисляет результаты элементов. Теперь у меня есть команда, которая должна вызвать другое представление , детали предмета.

Использование логики для отображения другого представления в представлении поиска кажется неправильным, оно вообще не поддается тестированию.

Вот моя реализация ViewModel, которая не тестируется ...

public class SearchViewModel
{
   public void SelectItem()
   {
     // I want to call the DetailsView from here
     // this seems wrong, and is untestable
     var detailsView = new DetailsView();
     detailsView.Show();
   }
}

Куда идет логика для отображения представления из метода ViewModel в этом шаблоне?

Ответы [ 5 ]

19 голосов
/ 21 ноября 2008

Как заметил Кифф:

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

Почти всегда будет какой-то интерфейс событие уровня, которое будет указывать на нужно создать вид. В вашем Например, это может быть строка (double) событие клика на сетке данных. Тот было бы местом для новых и показать ваше окно DetailsView.

Вы должны понимать, что M-V-VM немного отличается от других шаблонов, таких как MVC или MVP. ViewModel не имеет прямых знаний об интерфейсе пользователя. Открытие другого вида является функцией, специфичной для вида. Модель представления не должна заботиться о том, что или сколько видов используют ее данные. Скорее всего, я бы никогда не открыл представление с помощью команды.

альтернативный текст http://blogs.msdn.com//johngossman/attachment/576163.ashx

12 голосов
/ 20 ноября 2008

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

Почти всегда будет какое-то событие уровня пользовательского интерфейса, которое будет указывать на необходимость создания представления. В вашем примере это может быть событие двойного щелчка на сетке данных. Это было бы местом для обновления и показа вашего окна DetailsView.

4 голосов
/ 30 января 2009

Вот базовое правило по этому вопросу.

  • Если вы выполняете локальные действия в ваше мнение, вы можете начать с посмотреть модель.

  • Если это перекрестное представление (например, показ экрана поиска), то либо используйте шаблон EventAggregator (службу обработки событий), либо внедрите Application Controller, для которого вы вызываете методы, и он в свою очередь отображает поиск. *

1 голос
/ 29 декабря 2012

Catel включает в себя подход, который предполагает использование IUIVisualizerService. Этот интерфейс определяет контроллер пользовательского интерфейса, который можно использовать для отображения диалогов в модальной или модальной форме из ViewModel. По сути, внутри родительского vm вы создаете модель представления, которая должна оставаться за новым представлением, и служба находит связанный (на основе некоторого соглашения или регистрации) и затем показывает его.

0 голосов
/ 19 ноября 2008

Мы используем вариант с этим шаблоном. Здесь у нас есть контроллеры, которые представляют виртуальную машину, поэтому текстовый интерфейс представления - это виртуальная машина, а наши DTO - свойства виртуальной машины / контроллера. Мы по-прежнему называем его контроллером, поскольку используем его в качестве контрольной точки и, таким образом, обрабатываем определенную команду из представления. Здесь (я думаю) мы бы реализовали такую ​​команду, как ваша.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...