Или мы можем сделать это MVVM способом, создав команду во ViewModel, вызвав Window, чтобы показать окно сообщения ... и т. Д.
Позвольте мне выделить это отдельно, главным образом потому, что IMVHO я вижу, что это все время делается неправильно - многие люди пытаются сделать слишком много в ВМ. Прежде всего, задайте себе вопрос:
Связан ли запрос с данными или бизнес-правилами каким-либо образом?
Если это не так, то есть это просто "ты действительно уверен?" Напечатайте приглашение, тогда это ДОЛЖНО быть сделано исключительно в коде позади представления. Единственный раз, когда модель представления должна иметь какие-либо знания или предпринимать какие-либо действия, это когда она фактически имеет какое-либо отношение к модели представления, и в этом случае вы должны предоставить команду от ВМ, , но фактическое закрытие окна все еще выполняется из код за представлением .
ВМ должна знать ничего о представлении, с которым она связана, что является одной из целей шаблона MVVM. Он может предоставлять команды, но он не должен знать, что пользователь взаимодействовал с определенным элементом пользовательского интерфейса 1 , и он не должен напрямую знать, что окно будет закрыто. Это нормально для виртуальной машины (через диалоговую службу, которая у вас есть, да?), Что текущие данные не сохранены, но она не знает об окне в целом, потому что она не знает, как ее данные представил.
Иногда вы будете идти по тонкой грани, и легко переоценить, следует ли что-то делать исключительно из представления, исключительно из ВМ, или как смесь того и другого. Если вы помните роль виртуальной машины и помните, что в представлении кода хорошо (при условии, что он выполняет только связанные с просмотром вещи и передает содержимое виртуальной машины на виртуальную машину), то в 99% случаев вы этого не сделаете. есть проблема.
1 Например, виртуальная машина не должна знать или беспокоиться о том, нажал ли пользователь кнопку, гиперссылку или коснулся горячей точки на изображении. Эту же команду можно использовать для обработки всего этого.