2012-01-18 6 views
2

Мы работаем с приложением, которое использует призму и MVVM для отслеживания операций здравоохранения.PRISM: Передача объекта/событий от родителя к ребенку. Просмотр/VM с PopupRegions

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

Таким образом, когда мы нажимаем на ячейку, вызывается операция активации ячейки в коде, стоящем за этим представлением, который затем вызывает метод в модели представления для .RequestNavigate к представлению, зарегистрированному для «вторичной» области всплывающих окон (таким образом, запуск того, что, по-видимому, является диалогом над существующим приложением).

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

У меня есть объект-посредник, который мы используем для передачи информации от детей родителям, но это не работает в другом направлении, потому что операции публикации/уведомления для посредника требуют, чтобы дочернее представление было «уже», родитель публикует эту информацию.

Я обнаружил, что структуры агрегатора событий, встроенные в классы Prism.Events, также не работают (я предполагаю из-за того же вопроса публикации/подписки). Я могу опубликовать событие через агрегатор событий из родительского представления и подписаться в дочернем представлении, но я должен запустить дочерний вид «дважды», чтобы связать событие, связанное с операцией агрегатора событий, чтобы фактически запустить.

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

  • Родительский взгляд уже создан в существующем регионе.
  • Нажатие на ячейку в родительском представлении создает экземпляр (переходит к) дочернему виду в области всплывающих окон.
  • Операция с одним кликом должна передать объект из родительского представления в дочерний, чтобы дочерний вид мог фильтровать свои собственные данные на основе этого объекта.
  • Операции строятся с использованием Prism/MVVM.

Любая помощь, предложения, указатели, идеи были бы замечательными.

ответ

1

У нас был такой же сценарий, и в итоге мы создали UiService, которые были введены в наши ViewModels. Наш базовый класс ViewModel имеет метод SetModel, который UiService вызывает при навигации, для отправки параметров в режим назначения.

К примеру:

Нажатие кнопки в существующем виде.

Источник ViewModel вызывает UIService ShowView (данные).

UiService вызывает RequestNavigate для запрашиваемого вида.

UiService вызывает SetModel в точке назначения ViewModel (путем доступа к DataContext запрашиваемого представления) для передачи данных из исходного ViewModel.

1

В зависимости, что вы хотите передать это может быть довольно просто с INavigationAware

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

var query = new UriQuery 
     { 
      { "MailItemKey", this.SelectedMailItem.MailItemKey.ToString(CultureInfo.InvariantCulture) } 
     }; 

    RegionManager.RequestNavigate(RegionNames.Popup, typeof(MailItemView).Name + query.ToString()); 

А внутри MailItemViewModel который VM код нашего PopUp является так:

public override void OnNavigatedTo(NavigationContext navigationContext) 
     { 
      var mailItemKey = int.Parse(navigationContext.Parameters["MailItemKey"]); 

      } 

Если вы хотите передать пользовательские объекты - это будет более сложный. Я бы искал образцы MVVM in the box - есть какой-то код о том, как это делается. Мне пришлось многократно перерабатывать его, а код не копируется.

+0

Это не работает, если PopupRegion ранее не использовался. – Landerah

0

Звучит как идеальное использование RegionContext.

Родительский взгляд содержит область, в которой могут быть задействованы несколько «дочерних» видов. Им нужно поделиться каким-то контекстом или данными. Задайте контекст региона и привяжите или передайте всю информацию обо всех «дочерних» представлениях в Регионе.

См. Образцы Призмы вокруг RegionContext.

Смежные вопросы