События и сервисы используются для разных вещей. Вам не нужно выбирать между ними, вы можете использовать их для разных целей. Обычно вы используете событие, чтобы уведомить слушателей о том, что что-то произошло. Пример: пользователи изменяют размер шрифта в настройках приложения. Вы бы отправили событие всем слушателям (например, viewmodels), чтобы представления обновлялись. Обычно событие - это такая вещь, на которую вы не получаете ответ (хотя вы можете прикрепить, например, функцию / действие обратного вызова, которую вызовет прослушиватель событий).
Что если вашей viewmodel нужно открыть новое окно? Обычно viewmodel не должно волновать, как открывается это новое окно, является ли оно модальным или нет. В этом случае было бы легко воспользоваться услугой:
windowManager.ShowDetailsView();
WindowManager (который вы используете через интерфейс IWindowManager) отвечает за отображение подробного представления. Может быть, это модальный вид или может быть какая-то анимация слайдов. Дело в том, что модели представления, использующей IWindowManager, все равно.
В некоторых случаях вам может потребоваться получить уведомление, если пользователь нажимает кнопку «ОК» или «Отмена». Вы все еще можете использовать IWindowManager, имея такой метод:
public void ShowEditView(Action userSavedChanged, Action userCancelled);
Тогда просто вызовите его из модели представления
windowManager.ShowEditView(this.SaveChanges, this.CancelChanges);
// in your viewmodel you have the SaveChanges and CancelChanges methods
private void SaveChanges()
{
// save the changes.
}
Надеюсь, все это имеет смысл. Ведь это пятница:)