Prism с MVVM - как активировать представление в загруженном модуле из оболочки - PullRequest
2 голосов
/ 20 сентября 2011

В настоящее время я знакомлюсь с Prism 4.0 и MVVM (использую Cinch 2.0 в качестве инфраструктуры MVVM). Я создаю оболочку для приложения, которое будет содержать примерно 15 модулей. Мы используем WPF.

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

  • Пользователь нажимает на кнопку. Модуль загружается, вид добавляется в регион и отображается.
  • Пользователь нажимает кнопку для какого-то другого модуля. Та же идея, что и выше. Представление для этого модуля отображается в том же регионе, заменяя представление из предыдущего модуля.

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

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

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

Опять же, может быть, я просто ошибаюсь ... Не будет первым. :)

Спасибо!

Ответы [ 3 ]

1 голос
/ 22 сентября 2011

Если вы не хотите активировать представление из вашей оболочки, то вы можете создать CompositePresentationEvent, который будет содержать имя модуля или любые другие данные, которые могут идентифицировать конкретный модуль.Затем передайте это событие во всем приложении с помощью EventAggregator от Prism.Наконец, заставьте ваши модули слушать это событие.Если они определены в событии как модуль, необходимый для активации их представлений, просто введите код для активации представлений.

Посмотрите на ответ на этот вопрос: Связь с EventAggregator в Prism В примере рассматривается, как общаться внутри приложения Prism, не зная получателя.

0 голосов
/ 22 сентября 2011

В вашей установке RPISM взгляните на

Prism \ Quickstarts \ Навигация с переключением режимов просмотра

Ваша оболочка не должна знать о модуле. RegionManager позаботится о загрузке просмотров по запросу.

В этом примере показано, как кнопки (радиокнопки слева) используют навигацию для изменения вида. И вы можете контролировать с помощью MEF, если такой же или новый экземпляр создан и т. Д.

Идея в том, что вы регистрируете просмотр только для меню (вашей ленты). Тогда вы просто перемещаетесь. Дайте мне знать, если вам нужна дополнительная информация

0 голосов
/ 20 сентября 2011

Может быть, вы могли бы решить проблему с помощью нажатия кнопки, когда вы не только загружаете модель, но итерируете уже загруженные модули, и если ваши уже существуют, вы устанавливаете, что они активны в его ViewModel и View может искать свойство в ViewModel , если оно активно или нет, и вы уведомляете View с помощью INotifyPropertyChange .

Это только дикое предположение, что я новичок в MVVM и еще новее в Prims : D

...