Как работать с окнами в WPF/MVVM?
Добрый день.
Вот старенькая статья с тремя разными вариантами реализации показа дочерних окон. Сейчас правда уже другой подход использую. Когда все дочерние View создаются как контролы. Дочернее окно одно и содержит ContentPresenter. При вызове метода показа дочернего окна в его DataContext помещается ViewModel. А как сопоставить View и ViewModel храниться в ресурсах:<DataTemplate DataType="{x:Type viewmodel:ResponsePart8ViewModel}">
     <view:ResponsePart8View HorizontalAlignment="Stretch" />
</DataTemplate>
При показе окна ContentPresenter сам, по типу объекта лежащего в DataContext создает View. Если не очень понятно, то могу скинуть развернутый пример.
Не вижу проблемы, честно говоря. Если вью модель инициализируется во всех окнах одинаково, особенно если автоматически, то можно просто создавать окна и показывать. В зависимости от условий разные.
Пример:
Модель:namespace MyApp.MyNamespace.ViewModels
{
	public class MyWindowModel : INotifyPropertyChanged
	{
	   private object _foo;
	   public object Foo
	   {
		  get { return _foo; }
		  set { _foo = value; RaisePropertyChanged("Foo"); }
	   }

	...

	}
}
Вьюшка:<Window x:Class="MyApp.MyNamespace.MyWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:viewModels="clr-namespace:MyApp.MyNamespace.ViewModels">
   <Window.DataContext>
      <viewModels:MyWindowModel x:Key="Model" />
   </Window.DataContext>
   <Grid>
      <TextBlock Text={Binding Foo} />
   </Grid>
</Window>
Вызывать можно так, например как вы говорите из окошка логина:...
// проверяем успешность логина
if (!loginSuccess)
	return;

// если всё хорошо, то создаём новое окно
var myWindow = new MyWindow();

// если нужно - что-то делаем с моделью внутри окна
var model = myWindow.DataContext as MyWindowModel;
model.Foo = new object();

// показываем новое окно
myWindow.Show();

// закрываем текущее окно логина
var window = Application.Current.Windows[0];
if (window != null)
	window.Close();