ПРИЗМА: Передача объекта / событий от родителя к дочернему View / VM с PopupRegions - PullRequest
3 голосов
/ 18 января 2012

Мы работаем с приложением, которое использует призму и MVVM для операций отслеживания здравоохранения.

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

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

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

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

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

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

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

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

Ответы [ 3 ]

2 голосов
/ 19 января 2012

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

Например:

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

Source ViewModel вызывает UiService ShowView (data).

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

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

1 голос
/ 19 января 2012

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

Звучит так, будто вы хотите передать что-то вроде строки запроса - параметры и т. Д. Код для открытия окна будет выглядеть так:

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

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

И внутри MailItemViewModel, который является кодом виртуальной машины нашего всплывающего окна, выглядит так:

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

            }

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

0 голосов
/ 25 октября 2013

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

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

См. Примеры Призмы вокруг RegionContext.

...