Хорошим шаблоном дизайна будет иметь два разных шаблона данных: один для представления данных перед входом в систему и второй шаблон данных для использования после входа в систему.
Есть несколько способов достичь этого. Тот, который я обычно использую, просто помещает ViewModel (непосредственно с использованием привязки) в единственные дочерние элементы Window.
В вашей ViewModel реализуйте класс селектора контента. Это класс, производный от DataTemplateSelector и использующий API FindResource для получения соответствующего шаблона данных.
<Window ...>
<Window.Resources>
<DataTemplate x:key="beforeLogin">
...
</DataTemplate>
<DataTemplate x:Key="afterLogin">
...
</DataTemplate>
</Window.Resources>
<Window.ContentTemplateSelector>
<code:MyTemplateSelector />
</Window.ContentTemplateSelector>
<-- Here is the content of Window. It's the view model (data). The View will be
bind by the TemplateSelector
<code:YourViewModel />
</Window>
Проверьте эту страницу: http://msdn.microsoft.com/en-us/library/system.windows.controls.contentcontrol.contenttemplateselector.aspx для соответствующего примера.
Существуют другие схемы проектирования. Еще одна распространенная идиома - это просто запуск события «UiRequest», которое будет подхвачено выделенным кодом представления. Помните, что MVVM требует, чтобы ViewModel был «независимым от вида», но на самом деле это не означает «нет кода позади». Это означает, что виртуальная машина не может ссылаться на что-либо в представлении. Связь таким образом происходит при просмотре событий (например, привязка данных - это просто оболочка вокруг событий, измененных свойством). Поэтому имейте событие UiRequest в вашей модели представления и разработайте протокол. В конструкторе View - зарегистрируйте обработчик. В обработчике измените содержимое (люди используют эту идиому в основном для запуска всплывающего окна, но его можно использовать где угодно).