Мастер детали с помощью всплывающего диалога и Prism4 - PullRequest
1 голос
/ 10 января 2011

Версии этого вопроса были заданы, но я не думаю, что это дубликат как таковой. Я создаю LOB-приложение на C # / Prism4 и пытаюсь получить правильную архитектуру с первого дня. Приложение (со временем) будет иметь несколько экранов мастера / сведений, а также экраны редактирования со встроенными сетками, которые можно редактировать. Например: отобразить список пользователей с возможностью добавления или редактирования через всплывающее окно.

В настоящий момент я думаю, что простым решением было бы иметь диалоговое окно в виде скрытой панели данных, привязанной к той же модели представления с ее видимостью, контролируемой привязкой данных. Чтобы отредактировать пользователя (используя приведенный выше пример), сделайте копию данных для редактирования, а затем установите флаг IsInEditMode в значение true, чтобы отобразить диалоговое окно. Обычное командование может затем захватить кнопки «сохранить» / «отменить», чтобы обновить модель (или нет).

Несмотря на то, что это звучит просто для реализации, оно кажется немного неправильным. Существует разделение проблем, просто создается впечатление, что модель представления мультиплексируется.

Я сталкивался с руководством Prism InteractionRequest, но оно кажется более ориентированным на простые всплывающие окна («Вы уверены, что хотите отменить?»).

Мне нужно решение, которое масштабируется на десятки экранов. Он должен быть простым и легким в обслуживании.

Заранее спасибо.

Ответы [ 3 ]

2 голосов
/ 10 января 2011

Общий подход состоит в том, чтобы иметь так называемый сервис диалога с интерфейсом, похожим на этот:

public interface IDialogService
{        
    bool? ShowDialog<TViewModel>(TViewModel viewModel);
}

И всякий раз, когда вам нужно показать диалог, вы вызываете метод ShowDialog, передавая модель представления для диалога,А сервис берет на себя все остальное.Он может показывать скрытую панель, реальное диалоговое окно или всплывающее окно - это зависит от реализации, и вызывающая сторона ничего об этом не знает.

1 голос
/ 11 января 2011

По моему мнению, основные детали заслуживают отдельного представления (часть VM может быть необходима, если детали имеют несколько объектов модели).

Тем не менее, я бы определенно использовал PopupRegionBehavior, который был частью RI для Prism 2.2. Это особенно полезно для этого сценария, так как позволяет зарегистрировать главное представление сведений в определенном регионе (и если вы когда-нибудь решите извлечь данные в оболочку, это все равно будет работать).

На форуме Prism в codeplex много тем обсуждается.

0 голосов
/ 11 января 2011

Я бы не согласился с тем, что в вашем диалоговом окне всегда должна быть собственная виртуальная машина, вызывающая сторона может просто передать свой собственный DataContext, поэтому вам не нужно заботиться о синхронизации maser / child ViewModel, и к нему нечего делать. с разделением интересов. Например, у вас есть форма профиля пользователя (maser) и есть модальный адрес диалога - если вы передаете vm профиля после закрытия диалогового окна, ваши свойства, связанные с адресом, и поля представления обновляются автоматически (наслаждайтесь привязкой).

...