Скажем, у меня есть приложение, которое отображает список друзей пользователя. Список друзей отображается в виде TabItem. Пользователь должен сначала войти на сервер, чтобы получить список друзей.
Я создал два пользовательских элемента управления: один для входа пользователя, другой для разблокировки. что-то в одиночку эта строка:
UnloggedView.xaml
<UserControl x:Class="UnloggedView" ...>
<TextBlock ...>You need to <Hyperlink Command="{Binding LoginCmd}">
Login</Hyperlink>too see your friends list</TextBlock>
</UserControl>
LoggedView.xaml:
<UserControl x:Class="LoggedView" ...>
...
<ListView ItemSource={Binding Path=friends}">...
</UserControl>
Главное окно имеет следующий код:
....
<TabItem Header="Friends">
<vw:UnloggedView />
</TabItem>
Я считаю, что все в соответствии с принципом MVVM. LoginCmd - это упрощенный вариант DelegateCommand (из призмы), реализованный во ViewModel. Оба Представления работают нормально, и, поскольку список заполняется (асинхронно), уведомления запускаются, и Представление обновляется. Я счастлив.
Итак, у меня есть два вопроса: Первый вопрос - как запустить окно LoginWindow (где пользователю предлагается ввести свои учетные данные? Сейчас я просто создаю LoginWindow (объект представления) и представляю его с помощью ShowDialog. похоже, что я нарушаю правила MVVM, напрямую манипулируя пользовательским интерфейсом из ViewModel.
Главный вопрос: после того, как я войду в систему с сервера, как правильно заменить содержимое TabItem на LoggedView. Согласно принципам MVVM, ViewModel не должна иметь знаний о внутренностях View. Я раскрываю свойство IsLogged во ViewModel (которое будет запускать уведомление PropertyChanged), но что мне следует связать с тем, чтобы все происходило? Я действительно не хочу, чтобы ViewModel манипулировал View.
Спасибо