Жесткая приверженность модели MVVM? - PullRequest
2 голосов
/ 19 марта 2012

Я создаю приложение WPF и впервые использую MVVM. В целом использование MVVM было очень интересным, и одним из основных преимуществ является хорошее разделение между классами представления и модели. Это своего рода дисциплины (по крайней мере, молодые разработчики), чтобы не смешивать их вместе.

У нас есть сценарий, в котором необходимо закрыть окно нажатием кнопки после окна подтверждения. Теперь это может быть достигнуто по-старому, обрабатывая событие нажатия кнопки и закрывая окно в самом классе Window. Или мы можем сделать это MVVM способом, создав команду во ViewModel, вызвав Window, чтобы показать окно сообщения ... и т. Д.

Я понимаю, что нужно сделать здесь, но у меня вопрос - нужно ли использовать команды MVVM во всех случаях? Существуют ли исключения, когда мы не должны использовать команды, например, простые действия интерфейса? Мы не злоупотребляем MVVM здесь? Какими именно выгодами будет все, что делает MVVM-способ?

1 Ответ

7 голосов
/ 19 марта 2012

Или мы можем сделать это MVVM способом, создав команду во ViewModel, вызвав Window, чтобы показать окно сообщения ... и т. Д.

Позвольте мне выделить это отдельно, главным образом потому, что IMVHO я вижу, что это все время делается неправильно - многие люди пытаются сделать слишком много в ВМ. Прежде всего, задайте себе вопрос:

Связан ли запрос с данными или бизнес-правилами каким-либо образом?

Если это не так, то есть это просто "ты действительно уверен?" Напечатайте приглашение, тогда это ДОЛЖНО быть сделано исключительно в коде позади представления. Единственный раз, когда модель представления должна иметь какие-либо знания или предпринимать какие-либо действия, это когда она фактически имеет какое-либо отношение к модели представления, и в этом случае вы должны предоставить команду от ВМ, , но фактическое закрытие окна все еще выполняется из код за представлением .

ВМ должна знать ничего о представлении, с которым она связана, что является одной из целей шаблона MVVM. Он может предоставлять команды, но он не должен знать, что пользователь взаимодействовал с определенным элементом пользовательского интерфейса 1 , и он не должен напрямую знать, что окно будет закрыто. Это нормально для виртуальной машины (через диалоговую службу, которая у вас есть, да?), Что текущие данные не сохранены, но она не знает об окне в целом, потому что она не знает, как ее данные представил.

Иногда вы будете идти по тонкой грани, и легко переоценить, следует ли что-то делать исключительно из представления, исключительно из ВМ, или как смесь того и другого. Если вы помните роль виртуальной машины и помните, что в представлении кода хорошо (при условии, что он выполняет только связанные с просмотром вещи и передает содержимое виртуальной машины на виртуальную машину), то в 99% случаев вы этого не сделаете. есть проблема.

1 Например, виртуальная машина не должна знать или беспокоиться о том, нажал ли пользователь кнопку, гиперссылку или коснулся горячей точки на изображении. Эту же команду можно использовать для обработки всего этого.

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