"Прекрасный" способ сделать модальный диалог в WPF с помощью Prism и MVVM Pattern

вчера я использовал google, чтобы найти несколько способов сделать удивительный многоразовый модальный диалог в WPF с PRISM 4.1 и шаблоном MVVM. Я нашел несколько примеров, но я должен сказать, что они не были такими "хорошенькими", как мне им нравилось.

Этот: WPF Modal Dialog (нет mvvm → не используется)

Это довольно приятно: Показывать диалоговые окна при использовании шаблона MVVM (но все же он использует самодельный ServiceLocator, который мне не нужен, поскольку я использую контейнер IUnity Container Я мог бы использовать логику и переписать ее в Unity, но это не "прекрасный" способ в моем честном мнении.

После некоторого поиска в Интернете для информации какой-то блог (не могу найти источник прямо сейчас) сказал мне, что в PRISM Framework есть что-то, называемое "запросы взаимодействия". Поэтому я проверил документацию на призму и нашел небольшую часть в разделе "расширенные сценарии mvvm", но информации, приведенной в документации, недостаточно.

Я хотел бы знать, есть ли у кого-нибудь хороший пример или хороший блог-блог о том, как реализовать удивительный модальный диалог в призме wpf с mvvm.

ИЗМЕНИТЬ: Что касается вопроса в комментариях:

Что делает модальный диалог потрясающим?

Действительно хороший вопрос.

  • Он должен быть модальным (в то время как диалог открыт, остальная часть пользовательского интерфейса должен быть заморожен)
  • В диалоговом окне может быть собственная модель просмотра или по крайней мере, я хотел бы предоставить экземпляр объекта для диалога просмотреть и вернуть объект обратно в родительский вид
  • Представление должно быть собственным файлом "xaml"
  • функция dialogresult от .NET или наименее способ получить ответ, который пользователь нажал в диалоговом окне

Ответы

Ответ 1

Запросы на взаимодействие требуют немного дополнительной работы, но они, безусловно, являются правильным способом перейти от перспективы пуриста MVVM...

Я видел пример того, как это сделать с Prism в Карле Шиффлетте MVVM In The Box расширение обучения.

Как я помню, пример был довольно грубым по краям, но он должен установить вас в правильном направлении.

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

Ответ 2

В PRISM 5.0 появилось быстрое решение для показа модальных диалогов. Использование PopupWindowAction.

<prism:InteractionRequestTrigger SourceObject="{Binding CustomPopupViewRequest, Mode=OneWay}">
    <prism:PopupWindowAction>
        <prism:PopupWindowAction.WindowContent>
            <views:CustomPopupView />
        </prism:PopupWindowAction.WindowContent>
    </prism:PopupWindowAction>
</prism:InteractionRequestTrigger>

Ответ 3

проверить мое сообщение из здесь

его простой, его mvvm, его служба и "все, что вам нужно делать" в вашей модели просмотра:

var result = this.uiDialogService.ShowDialog("Dialogwindow title goes here", dialogwindowVM);

Ответ 4

Предостережение: я не использовал PRISM, и мой ответ предполагает использование только WPF и MVVM. Я не рассматриваю это как серьезную проблему, так как ваш список требований может быть выполнен без PRISM (который может быть добавлен поверх базового решения на более позднем этапе).

У меня есть проект Github, который предоставляет настраиваемый элемент FrameworkElement под названием ModalContentPresenter, который позволяет отображать модальный контент. Элемент в основном состоит из двух панелей, один из которых расположен поверх другого. На задней панели размещается основной контент, а на передней панели размещается ваш модальный контент. Элемент имеет свойство зависимостей, которое определяет, отображается ли модальное содержимое.

Элемент предоставляет только базовую "модальную" функциональность и способен размещать произвольный контент (как и большинство элементов управления WPF). Если, например, модальный контент, который вы показываете, должен выглядеть и вести себя как окно (иметь заголовок, кнопку закрытия, перетаскивание мышью и т.д.), Тогда вам все равно придется выполнять некоторую работу.

Вот как ModalContentPresenter может удовлетворить ваши требования:

Он должен быть модальным (пока диалог открыт, остальная часть пользовательского интерфейса должна быть заморожена)

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

В диалоговом представлении может быть собственная модель viewmodel или, по крайней мере, я хотел бы предоставить экземпляр объекта для диалогового окна и вернуть объект обратно в родительский вид.

fooobar.com/info/353775/... показывает, как я рекомендую вам достичь этого.

Представление должно быть собственным файлом "xaml"

Как первичный, так и модальный контент можно определить с помощью встроенных xaml или отдельных файлов xaml (например, UserControl).

функция dialogresult из .NET или, по крайней мере, способ получить ответ, который пользователь нажал в диалоговом окне

Связанный ответ показывает, как получить "ответ" из вашего модального контента. Основная предпосылка заключается в том, что ваши viewModels общаются нормально (либо напрямую, либо с помощью других средств, таких как шина событий). Единственное отличие состоит в том, что вы просто являетесь отображением вашего контента таким образом, чтобы пользователь мог взаимодействовать только с "модальными" данными.