Не ссылаться на виды внутри модели вида. Имейте представления, создают представления, и модели представления создают модели представления.
Простой способ осуществить это разделение интересов - это события. Быстрый и грязный способ сделать это - создать свойство 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, но у тех, на которые я смотрел, есть инструменты обмена сообщениями, предназначенные для облегчения такого рода вещей.