Создание дружественной стратегии MVVM
Я пытаюсь создать стратегию обработки всплывающих форм для использования в любой части моего приложения. До сих пор я понимаю, что мне понадобится один UserControl
в корне моего MainWindow. Это будет связано с его собственным ViewModel, который будет обрабатывать сообщения, отправленные в приложении.
Я использую MVVM Light, и я довольно новичок в классе Messenger
.
Представьте себе сценарий "Мастер/Подробности", где список объектов содержится в ListBox
. При выборе одного из этих элементов и нажатии кнопки "Редактировать" отобразится UserControl
, который охватывает весь экран. Затем пользователь может отредактировать выбранный элемент и нажать "ОК", чтобы зафиксировать изменения.
Я хочу, чтобы UserControl
был открыт как "общий" таким образом, чтобы я мог на него набросить (возможно, ViewModel)... чтобы он отображал ViewModel с помощью DataTemplate
и обрабатывал все изменения объектов. Щелчок по ОК вызывает обратный вызов для класса отправки и сохраняется как и раньше.
В некоторых ситуациях, когда это было бы полезно,...
- Отображать сообщения об ошибках без ввода пользовательского ввода (кроме OK, чтобы закрыть его)
- Отобразить форму редактирования для элемента данных.
- Диалоги подтверждения (как и стандартный MessageBox)
Может ли кто-нибудь предоставить какие-либо образцы кода, как я мог бы это сделать?
Ответы
Ответ 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 для диалогового окна, которое вы хотите показать.