Подтвердить что ты не робот

Вопрос проектирования M-V-VM. Вызов из ViewModel

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

У меня есть ViewModel, я назову Search. Этот 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, входит в этот шаблон?

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

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

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

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

Ответ 3

Здесь основное эмпирическое правило.

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

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

Ответ 4

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

Ответ 5

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