Я потратил два дня, пытаясь понять это.
Я реализовал два способа работы с всплывающими окнами mvvm
Пример первого использования aproach:
_childWindowController
.ShowDialogWithResult<AddNationalityPopup,AddNationalityPopupModel, AddNationalityResult>(
(result, a) =>
{
if (a.DialogResult.HasValue && a.DialogResult.Value)
{
if (result.NationalityCountryId.HasValue)
{
Background.NationalityCountryId = result.NationalityCountryId.Value;
Background.NationalityDescription = result.NationalityDescription;
}
}
});
Второй подход:
var window = _childWindowController.CreateDialog<AddNationalityPopup>();
window.Closed += (sender, args) =>
{
if (args.DialogResult.HasValue && args.DialogResult.Value)
{
var result = (AddNationalityResult)window.Result;
if (result.NationalityCountryId.HasValue)
{
Background.NationalityCountryId = result.NationalityCountryId.Value;
Background.NationalityDescription = result.NationalityDescription;
}
}
};
window.ShowDialog();
В первом подходе пользователь службы должен знать типы представления, модель представления и результат, чтобы иметь возможность отображать диалог
Во втором интерфейсе немного упрощается, но мне все еще нужно знать, какой тип выдал результат перед его использованием.
Вы когда-нибудь сталкивались с проблемой отображения диалога с моделью просмотра?
Как улучшить дизайн службы окна?
Можете ли вы привести пример хорошей реализации службы диалога?
Я рекомендую вам взглянуть на "Шаблоны взаимодействия с пользователем" , поскольку в нем рассматриваются различные подходы, которые вы можете предпринять для обработки пользовательских взаимодействий в MVVM. Альтернативой использованию службы взаимодействия является реализация объекта запроса .
Другой подход к внедрению простые пользовательские взаимодействия в MVVM шаблон должен позволить модели представления делать запросы на взаимодействие непосредственно само представление через взаимодействие объект запроса в сочетании с поведением в представлении. Запрос на взаимодействие объект инкапсулирует детали запрос взаимодействия и его ответ, и связывается с Мероприятия. Взгляд подписывается на эти событий, чтобы инициировать пользовательский интерфейс части взаимодействия. Вид обычно будет инкапсулировать пользователя опыт взаимодействия в поведение, связанное с данными объект запроса на взаимодействие, предоставленный модель представления.
Этот подход обеспечивает простой, но гибкий механизм, который сохраняет чистое разделение между видами модель и вид - это позволяет вид модель для инкапсуляции приложения логики представления, включая любые требуемые взаимодействия с пользователем, в то время как что позволяет полностью инкапсулировать визуальные аспекты взаимодействия. Реализация модели представления, включая ожидаемые взаимодействия с пользователем через представление, может быть легко тестируется, а дизайнер пользовательского интерфейса большая гибкость в выборе способов для осуществления взаимодействия внутри вид с использованием различных поведения, которые инкапсулируют различные пользовательские взаимодействие.
Для примера того, как реализовать это, я рекомендую вам ознакомиться с исходным кодом Prism 4 и его образцами. Библиотека Prism поддерживает этот шаблон через интерфейс IInteractionRequest и InteractionRequest. Интерфейс IInteractionRequest определяет событие для инициирования взаимодействия, а поведение в представлении связывается с этим интерфейсом и подписывается на событие, которое оно предоставляет.
Вы можете использовать классы и интерфейсы, определенные в сборке Microsoft.Practices.Prism.Interactivity, или использовать эти типы в качестве основы для реализации вашей службы диалога.