Как работать с окнами в WPF/MVVM?

Здравствуйте.

Как правильно реализовать работу окон в WPF/MVVM? Например, открывается главная форма ввода логина/пароли, после ввода данных открывается другая форма, в зависимости, какой пользователь и какая у него роль. Гуглил, подходящих примеров не нашел. Везде рассматриваются модальные окна. Покидайте примеры, пожалуйста. Которые выполнены строго в соответствии MVVM-паттерна. Благодарю.
  • Вопрос задан
  • 16878 просмотров
Пригласить эксперта
Ответы на вопрос 4
@Teacher
Добрый день.
Вот старенькая статья с тремя разными вариантами реализации показа дочерних окон. Сейчас правда уже другой подход использую. Когда все дочерние View создаются как контролы. Дочернее окно одно и содержит ContentPresenter. При вызове метода показа дочернего окна в его DataContext помещается ViewModel. А как сопоставить View и ViewModel храниться в ресурсах:
<DataTemplate DataType="{x:Type viewmodel:ResponsePart8ViewModel}">
     <view:ResponsePart8View HorizontalAlignment="Stretch" />
</DataTemplate>

При показе окна ContentPresenter сам, по типу объекта лежащего в DataContext создает View. Если не очень понятно, то могу скинуть развернутый пример.
Ответ написан
xakpc
@xakpc
full-stack .net developer, CEO Leecero.com
в MVVM-паттерне нету никаких соглашений о навигации. Тема сама по себе это сложная,
рекомендую посмотреть как это сделано в Prism
habrahabr.ru/post/178009
оригинал
https://msdn.microsoft.com/en-us/library/gg430861(...

Обычно все строится на основе некоторого INavigationService который показывает по переданной VM необходимый View, хранит backstack и т.п.
Ответ написан
@i_light
Backend, XAML, crossplatform
Не вижу проблемы, честно говоря. Если вью модель инициализируется во всех окнах одинаково, особенно если автоматически, то можно просто создавать окна и показывать. В зависимости от условий разные.

Пример:

Модель:

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();
Ответ написан
@dmitry_dvm
Дык не сложно же.
На кнопку вешаете команду с логикой и переходом на нужную страницу.
Могу скинуть простейший пример с Prism, но для UWP.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы