Mvvm всплывающее окно с моделью представления, параметром и результатом - PullRequest
2 голосов
/ 08 июня 2011

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

Я реализовал два способа работы с всплывающими окнами mvvm

Пример первого использования:

_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();

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

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

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

Какулучшить дизайн оконного сервиса?

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

1 Ответ

7 голосов
/ 08 июня 2011

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...