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 может также использовать для вставки одной модели представления в другую с инъекцией зависимостей.