Я бы предложил использовать контроллер в этом сценарии, скажем, DI's dialogController, поддерживаемый диалоговой оболочкой.Модель представления источника (то есть, откуда исходит запрос на открытие диалогового окна) вызовет dialogController.ShowDialog(<<ViewNameToHostInRegion>>,<<RegionName>>)
.
Чтобы передать данные в диалоговое окно и в исходное представление и из него, вы можете использовать MessageBus.Таким образом, по существу, когда вы вызываете ShowDialog (), вы заполняете шину сообщений, и когда вызывается команда закрытия целевого представления (представление, размещенное в оболочке диалога) - скажем, с помощью кнопки «Выбрать» - пусть целевое представление добавляет / обновляет шину сообщений.Таким образом, модель исходного представления может работать с обновленными данными.
У нее много преимуществ:
1) Ваш исходный вид работает с диалоговым контроллером как BlackBox.то есть он не знает, что именно делает диалог.
2) Представление размещается в оболочке диалога - так что вы можете снова и снова использовать диалоговое окно
3) Модульное тестирование исходного представления ограничено, чтобы проверить фактическую функциональность текущегоviewmodel, а не тестировать диалоговое представление \ модель представления.
Один хедз-ап, с которым я столкнулся при этом, заключается в том, что при создании тестовых примеров вам может понадобиться написать тестируемый контроллер Dialog, который не показываетактуальный диалог при запуске тестов в связке.Поэтому вам нужно написать TestableDialogController, в котором ShowDialog ничего не делает (кроме наследования от IDialogController и обеспечения пустой реализации ShowDialog ().
Ниже приведен код psudeo:
LocalMessageBus.AddMessage(<MessageKey>,<MessageActualContentAsObject>);
dialogController.ShowDialog(<TargetViewName_SayEmployeeList>);
Employee selectedEmployee = LocalMessageBus.GetMessage(<MessageKey>) as Employee;
if (selectedEmployee != null)
{
//doSomework with selected employee
}