Mvvm всплывающее окно с моделью представления, параметром и результатом

2

Я потратил два дня, пытаясь понять это.

Я реализовал два способа работы с всплывающими окнами 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();

В первом подходе пользователь службы должен знать типы представления, модель представления и результат, чтобы иметь возможность отображать диалог

Во втором интерфейсе немного упрощается, но мне все еще нужно знать, какой тип выдал результат перед его использованием.

Вы когда-нибудь сталкивались с проблемой отображения диалога с моделью просмотра?

Как улучшить дизайн службы окна?

Можете ли вы привести пример хорошей реализации службы диалога?

Теги:
design-patterns
mvvm
silverlight

1 ответ

7
Лучший ответ

Я рекомендую вам взглянуть на "Шаблоны взаимодействия с пользователем" , поскольку в нем рассматриваются различные подходы, которые вы можете предпринять для обработки пользовательских взаимодействий в MVVM. Альтернативой использованию службы взаимодействия является реализация объекта запроса .

Другой подход к внедрению простые пользовательские взаимодействия в MVVM шаблон должен позволить модели представления делать запросы на взаимодействие непосредственно само представление через взаимодействие объект запроса в сочетании с поведением в представлении. Запрос на взаимодействие объект инкапсулирует детали запрос взаимодействия и его ответ, и связывается с Мероприятия. Взгляд подписывается на эти событий, чтобы инициировать пользовательский интерфейс части взаимодействия. Вид обычно будет инкапсулировать пользователя опыт взаимодействия в поведение, связанное с данными объект запроса на взаимодействие, предоставленный модель представления.

Этот подход обеспечивает простой, но гибкий механизм, который сохраняет чистое разделение между видами модель и вид - это позволяет вид модель для инкапсуляции приложения логики представления, включая любые требуемые взаимодействия с пользователем, в то время как что позволяет полностью инкапсулировать визуальные аспекты взаимодействия. Реализация модели представления, включая ожидаемые взаимодействия с пользователем через представление, может быть легко тестируется, а дизайнер пользовательского интерфейса большая гибкость в выборе способов для осуществления взаимодействия внутри вид с использованием различных поведения, которые инкапсулируют различные пользовательские взаимодействие.

Для примера того, как реализовать это, я рекомендую вам ознакомиться с исходным кодом Prism 4 и его образцами. Библиотека Prism поддерживает этот шаблон через интерфейс IInteractionRequest и InteractionRequest. Интерфейс IInteractionRequest определяет событие для инициирования взаимодействия, а поведение в представлении связывается с этим интерфейсом и подписывается на событие, которое оно предоставляет.

Вы можете использовать классы и интерфейсы, определенные в сборке Microsoft.Practices.Prism.Interactivity, или использовать эти типы в качестве основы для реализации вашей службы диалога.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню