Я собираюсь повторить ваши вопросы, как я их понимаю, вы можете исправить меня, где я что-то упустил. Кроме того, я довольно новичок во всем, что касается M-V-VM, поэтому прислушайтесь к моему совету с долей соли. Лучший способ научиться учиться - это выбросить мои идеи и исправить их.
Вы хотите знать вещи
1) Где должна существовать логика, чтобы решить, где показывать логин или главное окно
2) Какой режим выключения использовать
3) Что такое корень приложения
1)
Я считаю, что решение показывать логин или авто логин является бизнес-логикой, поэтому оно должно соответствовать модели вашей платформы M-V-VM. Как только эта логика реализована, представление может отображать любое окно, запрашиваемое моделью.
Я предполагаю, что у вашего приложения есть файл App.xaml и App.cs, который запускается при запуске приложения. Вы можете переопределить OnStartup в App.cs и отобразить любое необходимое окно на основе результатов бизнес-логики (которые изучаются при использовании какого-либо объекта в вашей модели).
2)
Для модели выключения я бы, вероятно, выбрал OnLastWindowClose, но я не знаю, сколько окон использует ваше приложение. Я предполагаю, что только два из них вы упомянули (логин и основной).
3)
Что такое корень приложения? Я бы сказал, что ваша Модель на самом деле является корнем приложения, поскольку в ней содержатся все важные элементы (представление - это пользовательский интерфейс модели, представление - это состояние представления). Поэтому, когда речь заходит о том, что является корнем или сущностью вашего приложения, я бы сказал, что это некий набор объектов в вашей модели.
Что называет что? Все будет зависеть от того, чего вы пытаетесь достичь. В общем, я избегаю, чтобы модель представления знала что-либо о представлении. И представление, и представление модели могут быть осведомлены о модели. В некоторых случаях вы захотите использовать Ninject в качестве менеджера сервисов, чтобы внедрить представление в модель представления (не заставляя модель представления зависеть от представления).
Совершенно другой подход заключается в том, чтобы вообще избегать входа в окно и отображать метод входа в главное окно. Вам все еще понадобится некоторый объект Model, чтобы сообщить вам, когда показывать приглашение на вход в систему, но вам не придется беспокоиться о манипулировании окнами. Честно говоря, я бы, наверное, пошел по этому пути. WPF предоставляет нам много интересных и сексуальных способов выполнить эту задачу.