Не ссылайтесь на представления внутри вашей модели просмотра. Имеют представления, создающие виды, и модели представления создают модели представления.
Простым способом решения этого разделения проблем является событие. Быстрый и грязный способ сделать это, чтобы создать ChildViewModel
свойство на вашей модели представления родительской, а затем обрабатывать PropertyChanged
в виде, например:
ParentViewModel vm = (ParentViewModel)DataContext;
vm.PropertyChanged += delegate(object sender, PropertyChangedEventArgs e)
{
if (e.PropertyName == "ChildViewModel")
{
MyChildWindow w = new MyChildWindow();
w.Show(vm.ChildViewModel);
}
};
Теперь каждый раз, когда модель Родительское представление изменяет ChildViewModel
собственность, родительский вид откроет новое дочернее представление.
Менее быстрые и менее грязный подход заключается в создании CreateViewEventHandler
делегата и CreateViewEventArgs
класса, и сделать обработчик события, и защищенный OnCreateView
метода, часть вашего базовой модели вида класса (если у вас есть). Это позволяет модели представления быть намного более явным, когда будет создано дочернее окно.
Обратите внимание, что если для модели родительского представления важно знать, когда модель дочернего представления закрыта, модель детского представления может выставить событие, которое родитель может подписаться (или, опять же, использовать свойство и событие PropertyChanged
).
Обратите внимание, что в обоих случаях вы можете написать модульные тесты, которые подтверждают, что модель просмотра открывает окно (т. Е. Поднимает событие), когда предполагается, что оно не связано с представлениями.
Я не использовал какие-либо рамки MVVM самостоятельно, но те, на которые я смотрел, имеют средства обмена сообщениями, которые предназначены для облегчения такого рода вещей.
Звучит неплохо, но также звучит нечетко. Можете ли вы показать мне пример того, как вы могли бы сделать мой пример правильно? (Т.е. есть одно окно, открывающее другое, с некоторыми данными, передаваемыми между ними.) – Vaccano
Постараюсь. Мне, вероятно, придется это исправить позже, так как я делаю это со своего телефона :) –
Это выглядит хорошо, за исключением того, что мой 'CustomerListView.DataContext' установлен в мой' CustomerListViewModel'. Если я настроюсь на результат «FindCustomer», я потеряю настройку MVVM для этого представления. – Vaccano