2008-11-19 5 views
17

Я только что начал изучать M-V-VM для приложения WPF. Все это имеет смысл до сих пор, кроме этого конкретного вопроса ...Вопрос проектирования M-V-VM. Calling View from ViewModel

У меня есть ViewModel Я позвоню Поиск. Этот ViewModel привязывается к datagrid и отображает результаты элементов. Теперь у меня есть команда, которая должна поднять другой вид, деталь деталя.

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

Вот моя реализация 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 идти в этой схеме?

ответ

12

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

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

+0

Спасибо за помощь, это похоже на жизнеспособное решение. Несмотря на то, что я не могу тестировать логику для настройки представления (настройка свойств, которые взаимодействуют с введенным ViewModel), он оставляет проверяемым ViewModels, в котором находится большинство логики. – Jab 2008-11-21 16:47:40

+1

Если простое событие открывает представление, это хорошо. Но что, если этому событию нужно еще какое-то действие, выборка данных, проверка. Не могли бы вы поместить этот материал в представление? Или создать другой уровень косвенности? – Sam 2009-01-08 09:51:42

0

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

18

Как Kiff отметил:

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

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

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

alt text http://blogs.msdn.com//johngossman/attachment/576163.ashx

4

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

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

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

1

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

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