Я частично согласен с @Rich и @Elad Katz. В наших приложениях мы используем MainViewModel, у которого есть свойства, которые представляют подвидовые модели. Такие как
public class MainViewMod
{
public SomeViewModel ContentViewModel
{
get;
set;
}
public StatusBarViewModel StatusBarViewModel
{
get;
set;
}
}
MainView получает свой DataContext из MainView. Скажем, MainView - это окно, и оно имеет <ContentControl Content="{Binding ContentViewModel}" />
и <ContentControl Content="{Binding StatusBarViewModel}" />
.
Различные ContentControls "живут" где-то внутри визуального дерева MainView.
Различным ViewModel не нужно знать друг о друге. Пока у вас слабая связь между viewModels, я не вижу проблем с подмоделями. Мое эмпирическое правило заключается в том, что StatusViewModel может получить доступ к MainViewModel. В некоторых сценариях StatusViewModel может получить доступ к ContentViewModel, но только через MainViewModel, но сохранить это как минимум. Но имейте в виду, что @Elad сказал о том, что они не слишком зависят друг от друга.
Когда дело доходит до событий, мне не нужно много сценариев, чтобы получить доступ к событиям напрямую в ViewModel. Скажем, у вас есть представление, у которого есть listView, и вам нужно либо получить, либо установить выбранный элемент. В этом случае я бы добавил свойство к ViewModel, то есть SelectedItem, и связал бы это свойство с SelectedItem списка просмотра. Таким образом, вы можете получить доступ к выбранному элементу из модели представления.
Имейте в виду, что нет проблем с выделением кода для представления. В некоторых ситуациях вы должны использовать код позади. Однако я бы рекомендовал не подписываться на события в code-behind, так как их трудно найти (скажем, одно из 20 представлений имеет code-behind, не естественно заглянуть в codehind для любого представления, чтобы найти какой-либо код). там понять что происходит). Если вы используете события для элемента, либо используйте привязки команд, как указано в других ответах, либо подпишитесь на событие в XAML. В некоторых ситуациях я предпочитаю использовать прикрепленное поведение, если мне нужен доступ к модели представления.