WPF MVVM Get Parent from VIEW MODEL - PullRequest
21 голосов
/ 04 мая 2010

В приложении MVFM WPF.

Как установить второго родительского окна из ViewModel?

пример:

view1 - viewModel1

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

var view2 = new view2

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

view2.Show()

EDIT:

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

Я использую свет MVVM -> http://mvvmlight.codeplex.com/ (удивительно, кстати)

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

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

Спасибо!

Ответы [ 5 ]

25 голосов
/ 04 мая 2010

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

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

Имеет ли это смысл?

Приветствия

Laurent

7 голосов
/ 15 сентября 2011

с вашей точки зрения модель звонить

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

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

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

А также напишите этот метод в коде представления:

private void ReplyToMessage(NotificationMessage msg)
{
   if (msg.Notification == "Open Window")
   {
      SecondWindow win = new SecondWindow();
      win.ShowDialog();
   }
}
1 голос
/ 04 мая 2010

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

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

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

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

Обработка диалогов в WPF с MVVM

0 голосов
/ 18 февраля 2013

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

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

0 голосов
/ 23 ноября 2010

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

Мне нравится Пример

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 +=, затем дважды нажмите на кнопку табуляции и в всплывающем окне регистрации введите код для открытия всплывающего окна.

...