Я разрабатываю очень большое приложение LOB, используя мой вкус M-V-VM, который я называю M-V-MC (Model-View-ModelController), который является своего рода комбинацией между M-V-C и M-V-VM. Я опубликовал этот ответ относительно того, как представления передаются в MV-VM на вопрос "what-are-the-most-common-mistakes-made-in-wpf-development".
Sam сделал следующий комментарий относительно моего ответа:
Это создает следующий вопрос: как вы создаете представления? я использую RelayCommands для привязки действий из просмотрите ViewModel, так что представление даже не знает, какое действие имеет не знает, что он должен открыть новый вид. Решение. Создайте событие в VM для представления, чтобы подписаться на?
Когда я изначально начал разработку MV-VM, у меня было это представление о том, что ВСЕ должно жить в ViewModel, и изучил множество примеров из таких парней, как Josh Смит и Карл Шиффлетт. Однако я еще не придумал хороший пример того, когда команда должна жить в ViewModel.
Например, скажем, у меня есть ListView, в котором отображаются клиенты, и кнопку, которую я нажимаю, чтобы разрешить мне редактировать выбранного клиента. ListView (View) привязан к CustomerVM (ViewModel). Щелчок по кнопке вызывает команду EditCustomerCommand, которая открывает всплывающее окно, которое позволяет мне редактировать все свойства CustomerVM. Где находится этот EditCustomerCommand? Если это связано с открытием окна (функциональность пользовательского интерфейса), не следует ли его определять в кодовом коде зрения?
Есть ли у кого-нибудь примеры того, когда я должен определить команду в представлении или в ViewModel?
Новый и удалить из списка будет хорошие примеры. В этих случаях пробел запись добавляется или текущая запись удаляется ViewModel. Любые действия, предпринятые точкой зрения, должны быть в ответ на эти события.
Итак, если я нажму новую кнопку, что произойдет? Новый экземпляр CustomerVM создается Parent ViewModel и добавлен в его коллекцию справа? Итак, как же тогда откроется экран редактирования? Представление должно создать новый экземпляр ViewModel Customer и передать его в метод ParentVM.Add(newCreatedVM)?
Скажем, я удаляю запись клиента через DeleteCommand, живущую на виртуальной машине. VM вызывает бизнес-уровень и пытается удалить запись. Он не может, поэтому он возвращает сообщение виртуальной машине. Я хочу отобразить это сообщение в диалоговом окне. Как представление выводит сообщение из действия команды?