nlawalker,
Я не эксперт, но что я узнаю о View-First и Model-First, так это:
- View-First: Просмотр программ ViewModel, Вы создаете представление, а затем автоматически создается viewmodel.
- Model-First: программы ViewModel View. Вы создаете граф объектов ViewModel в корневом приложении, назначаете его контексту данных корневого представления. затем позволяет представлению визуализировать связанный с ним дочерний объект в зависимости от модели представления.
Не хочу сказать, что подход Model-First плохой, но я предпочитаю подход View-First, потому что viewmodel может находиться в коде позади, поэтому, когда некоторый процесс требует дружественной задачи, не связанной с привязкой (PasswordBox, DialogConfirmation, ClosingForm и т.д.) я могу написать свою логику в коде позади.
В любом случае, для решения кейса я обычно использовал комбинацию IOC и Event Aggregator. Вот оно:
- Для viewmodel требует контекстной информации зарегистрировать свой экземпляр в контейнере IOC, чем его тип. Так что Аляс готов даже его мнение не.
- Когда происходит навигационное действие (при нажатии на элемент списка людей), разрешите ваш просмотр с помощью распознавателя контейнера IOC. и отправить событие на навигационную шину с указанным параметром. Далее это событие будет отлавливаться целевой ViewModel и что-то делать.
Регистрация экземпляра viewmodel на самом деле не нужна. это только для того, чтобы убедиться, что viewmodel готова, когда событие отправлено предыдущей viewmodel.
UPDATE
но затем, чтобы заполнить его любым локальным контекстом, мне нужно использовать глобальное средство для отправки ему события?
В вашем случае контекстный объект не является локальным, это скорее сообщение, передаваемое между вызовами объекта. Очевидно, что в подходе, основанном на модели, вы делаете:
//selectedPeople is contextual object
myPeopleDetailVM.LoadData(selectedPeople)
будет примерно так же, когда вы передадите selectedPeople
аргументу шины событий.
Если вы рассматриваете производительность, то вы можете сравнить ее с WPF Routed Event System , в этом случае стратегия маршрутизации является более сложной, чем Event Bus, и я думаю, если вы достаточно уверены в том, что используете WPF Routed Event, вы должны с агрегатором событий.
Единственная проблема, которую я вижу, если вы используете встроенный каркасный агрегатор событий (prism, mvvmlight), ваша viewmodel загрязнена шиной событий, если вы жалуетесь на это, то я согласен с вами.
Надеюсь, что поможет.