WPF MVVM получает родительскую часть от модели VIEW

В приложении MVV MVVM.

Как установить второй родительский элемент Windows из ViewModel?

Пример:

view1 - viewModel1

viewModel1 командные вызовы:

var view2 = new view2

view2.Owner= < ---- Это проблемная область. Как мне получить view1 как владельца здесь из ViewModel?

view2.Show()

EDIT:

См. принятый ответ ниже, затем прочитайте следующее редактирование.

Я использую свет MVVM → http://mvvmlight.codeplex.com/ (потрясающий битв)

Исправленная система обмена сообщениями великолепна. Теперь я отправляю сообщение из viewmodel в мое представление, говоря ему, чтобы показать другое окно.

Для сообщения, которое я использую в настоящее время с помощью оператора switch в главном представлении, чтобы определить, какой вид открыть; однако я могу возиться с токенами, которые также являются частью инструментария MVVM.

Спасибо!

Ответ 1

На мой взгляд, открытие нового окна является обязанностью View, а не ViewModel. Лично я бы использовал тот же подход, что и для отображения диалогового окна (это уже обсуждалось на этом форуме):

Попросите ViewModel отправить сообщение в представление, чтобы он открыл новое окно. (альтернативно) используйте IDialogService или все, что вы хотите назвать, которое вы передаете конструктору ViewModel. Эта служба будет отвечать за открытие окна (или делегирование этой задачи на представление). Таким образом, вы сохраняете чистое разделение проблем, и ваша VM остается поддающейся проверке (вы можете unit test, чтобы запрос на открытие нового WIndow был отправлен, но вы не смогли проверить, что окно действительно открыто).

Это имеет смысл?

Приветствия,

Лоран

Ответ 2

От вашего вызова viewmodel

Messenger.Default.Send<NotificationMessage>(new NotificationMessage("Open Window"));

И из вашего вида codebehind (вид, который вызывает второй       view) легко записать это в конструкторе:

Messenger.Default.Register<NotificationMessage>(this, ReplyToMessage);

И также напишите этот метод в view codebehind:

private void ReplyToMessage(NotificationMessage msg)
{
   if (msg.Notification == "Open Window")
   {
      SecondWindow win = new SecondWindow();
      win.ShowDialog();
   }
}

Ответ 3

У меня нет собственного ответа, но здесь несколько ссылок на то, что я смотрел в последнее время, что может помочь. Я также буду заинтересован в других предложениях.

Насколько я понимаю, ключевым моментом является то, что вы не должны создавать виды из Model View Model, если это возможно, поэтому вам нужно средство для обмена информацией о том, что вам нужно,.

http://www.codeproject.com/KB/WPF/XAMLDialog.aspx

http://www.codeproject.com/KB/architecture/MVVM_Dialogs.aspx

Обработка диалогов в WPF с помощью MVVM

Ответ 4

Вы можете сделать так, как вам нужно создать некоторые события и зарегистрировать их в представлении и вызвать их в виде model.and открыть это всплывающее окно.

Как этот пример

public class Mainclass : MainView
{
  public delegate abc RegisterPopUp(abc A);
  public RegisterPopUp POpUpEvent;

  public RelayCommand ShowCommand { private set; get; }  

  public void ShowCommand() 
  { 
    ShowCommand("Your parameter");
  } 
}

внутри представления

MainView mn = new MainView();

Зарегистрируйте событие здесь как mn.POpUpEvent +=, затем дважды нажмите кнопку вкладки и в режиме всплывающего регистра введите код для открытия всплывающего окна.

Ответ 5

Prism-Event Aggrigator - хороший подход, где мы можем создать независимый модуль без зависимости. первая viewmodel будет публиковать событие, а затем другое представление или представление или модель просмотра могут подписывать это событие от агрегирования событий.

в этом случае контейнер Unity может также использовать для вставки одной модели представления в другую с инъекцией зависимостей.