Подтвердить что ты не робот

Создание дружественной стратегии MVVM

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

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

Представьте себе сценарий "Мастер/Подробности", где список объектов содержится в ListBox. При выборе одного из этих элементов и нажатии кнопки "Редактировать" отобразится UserControl, который охватывает весь экран. Затем пользователь может отредактировать выбранный элемент и нажать "ОК", чтобы зафиксировать изменения.

Я хочу, чтобы UserControl был открыт как "общий" таким образом, чтобы я мог на него набросить (возможно, ViewModel)... чтобы он отображал ViewModel с помощью DataTemplate и обрабатывал все изменения объектов. Щелчок по ОК вызывает обратный вызов для класса отправки и сохраняется как и раньше.

В некоторых ситуациях, когда это было бы полезно,...

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

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

4b9b3361

Ответ 1

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

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

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

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

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

Еще одно возможное решение - использовать обмен сообщениями для отображения диалогов.

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

Ответ 2

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

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

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

Ответ 3

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