Лично я нахожу технику извлечения событий из виртуальной машины и ловли их в представлении приемлемой в определенных обстоятельствах. Я обычно предпочитаю работать с Messenger для таких случаев, особенно, если вам нужны пользовательские аргументы событий (потому что достаточно много работы для объявления нового класса аргументов события и нового делегата).
Кроме того, обработчик событий представляет собой тесную связь между view и viewmodel, хотя вы обычно предпочитаете слабую связь, но если вы знаете об этом факте и о последствиях, то почему бы и нет ...
Другой метод (например, для навигации, диалогов и т. Д.) - объявить интерфейс с необходимыми вам методами (например, IDialogService с методами AskConfirmation и ShowMessage). Затем попросите класс реализовать этот интерфейс (это может быть сам MainWindow / MainPage) и передать его в ViewModel (например, в конструкторе View сразу после вызова InitializeComponent). В ВМ вызывайте эти методы при необходимости. Преимущество этого метода в том, что его легко тестировать (просто смоделируйте IDialogService и проверьте, что методы вызываются).
Обычно я переключаюсь между Messenger и IDialogService в зависимости от различных факторов. Однако в последнее время я предпочитаю подход, основанный на интерфейсе, потому что его немного проще тестировать (но Messenger также достаточно тестируем, поэтому YMMV).
Ура,
Laurent