Создание дружественной MVVM стратегии диалога - PullRequest
22 голосов
/ 06 июля 2011

Я пытаюсь создать стратегию для обработки всплывающих форм для использования в любой части моего приложения.Насколько я понимаю, мне понадобится один UserControl в корне моего главного окна.Это будет связано с его собственной ViewModel, которая будет обрабатывать сообщения, отправленные в приложении.

Я использую MVVM Light, и я довольно плохо знаком с классом Messenger.

Представьте себе сценарий Master / Details, где список объектов содержится в ListBox.Если выбрать один из этих элементов и нажать кнопку «Изменить», отобразится UserControl, охватывающий весь экран.Затем пользователь может отредактировать выбранный элемент и нажать «ОК», чтобы зафиксировать изменение.

Я хочу, чтобы открываемый UserControl был «универсальным» способом, которым я могу выбросить любой (возможно, ViewModel)на это ... для него, чтобы визуализировать ViewModel через DataTemplate и обрабатывать все изменения объекта.Нажатие OK вызовет обратный вызов к классу отправки и сохранит изменение, как и раньше.

В некоторых случаях это может быть полезно: ...

  1. Отображение сообщений об ошибках без ввода данных пользователем (кроме OK, чтобы закрыть его)
  2. Показать форму редактирования для элемента данных
  3. Диалоги подтверждения (во многом как стандартный MessageBox)

Может кто-нибудь предоставить любой кодобразцы того, как я мог бы достичь этого?

Ответы [ 3 ]

21 голосов
/ 07 июля 2011

При разработке пользовательского интерфейса с MVVM цель состоит в том, чтобы отделить интересы View от проблем ViewModel.В идеале ViewModel не должен полагаться на какие-либо компоненты представления.Тем не менее, это идеал, и другое правило MVVM заключается в том, что вы должны разрабатывать свое приложение по своему желанию.

В области, предоставляющей сервис, показывающий диалоги, есть два различных подхода с плавающей точкой:

  1. Реализация DialogService в представлении (например, см. http://geekswithblogs.net/lbugnion/archive/2011/04/13/deep-dive-mvvm-samples-mix11-deepdivemvvm.aspx Образец 03).
  2. Реализация сервисного компонента, который не присоединен к представлению (например, см. http://blog.roboblob.com/2010/01/19/modal-dialogs-with-mvvm-and-silverlight-4/)

Оба подхода основаны на интерфейсе, который определяет функциональные возможности, которые предоставляет служба. Реализация этой службы затем внедряется в ViewModel.

Кроме того, оба подхода имеют свои специфические преимущества и недостатки.

  • Первый подход также хорошо работает для WP7, однако он требует общего базового класса представления, поскольку он содержит реализацию службы представления.
  • Второй подход хорошо работает для SilverLight иWPF и appleals, поскольку он держит сервис отдельно от представления и не навязываетограничения на просмотр.

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

Какой бы подход вы не использовали, постарайтесь не связывать View и ViewModel с помощью шаблона IoC (инверсия управления), то есть определите интерфейс, чтобы вы могли использовать различные реализации.Чтобы связать сервисы с ViewModel, используйте инъекцию, то есть, передав сервис в конструктор ViewModel или установив свойство.

7 голосов
/ 06 июля 2011

Я недавно начал изучать MVVM для создаваемого приложения WPF, я использовал эту статью в качестве основы для показа диалогов, если вы скачаете пример проекта, то это на самом деле довольно хороший развязанный метод, онприятно абстрагироваться, и чтобы получить представление, вы передаете экземпляр модели представления.Я несколько расширил его для своих собственных средств, я также использовал WPBExtendedToolkit MessageBox для предупреждений, ошибок и т. Д., Потому что стандартный win32 MessageBox бесполезен.

Что касается динамических форм, то вы захотите исследовать ItemsControl, ив ваших ViewModels есть коллекция элементов данных, которые должны быть отредактированы пользователем для привязки к ItemsControl.У меня есть диалог для редактирования действий и их параметров в конструкторе системы рабочего процесса, где диалоговый список действий был полностью динамичным.Это было сделано путем выставления коллекции моих элементов с их типами данных, чтобы я мог затем использовать DataTemplateSelector для выбора DataTemplates, которые содержали правильные типы элементов управления, то есть тип данных DateTime показал DatePicker.

Надеюсь, что поможет

2 голосов
/ 06 июля 2011

С точки зрения разработчика, который хочет «поддерживать» этот общий код, это звучит как боль.Исходя из того, что вы описали, я бы придал форме и диалогу ту же модель представления и создал бы конкретный шаблон XAML для диалога, который вы хотите показать.

...