Есть несколько способов сделать это в MVVM. Я согласен со Стивом Роббинсом, что «ваша виртуальная машина не несет ответственности за загрузку другого экрана», но ваша виртуальная машина несет ответственность за получение уведомления о том, что что-то произошло, что требует отображения нового экрана, и прохождения этого. уведомление вместе с объектом, который будет выполнять загрузку и выгрузку представлений по мере необходимости. Следует помнить, что каждая виртуальная машина привязана к представлению, и она заменяется при отображении нового представления. Таким образом, что-то еще, в природе руководителя, должно сделать замену.
Вот почему платформе Composite WPF (Prism) уделяется так много внимания. Я боролся с теми же проблемами, которые вы поднимали до изучения Prism, который предоставляет исполнительная власть. Я предполагаю, что ваш список категорий отображается в элементе управления. По сути, в вашей ситуации я бы, вероятно, связал свойство SelectedItem элемента управления со свойством SelectedItem в виртуальной машине. Я хотел бы, чтобы установщик этого свойства вызывал метод MVVM, который уведомляет инфраструктуру Prism о выделении и передает SelectedItem, который был передан в установщик свойства. Я бы использовал Prism для загрузки модуля со страницей, которая должна отображаться.
Приятной особенностью Prism является то, что она будет работать, если вы хотите, чтобы ваша страница Продукта заменила страницу категории, и будет работать так же хорошо, если вы хотите отобразить панель Продукт рядом с панелью Категории в том же окне. При настройке оболочки (в главном окне) достаточно указать один или два региона.
У Призмы есть кривая обучения, но она не очень крутая. Он очень хорошо работает с MVVM и является отличной средой для любого приложения, которое может извлечь выгоду из разделения. Я считаю это ключевым элементом дизайна приложений WPF.