Prism 2 SL: удаление вида из региона при нажатии кнопки - PullRequest
1 голос
/ 16 марта 2009

Я новичок в Prism и пытаюсь определить наилучшую практику для деактивации представления в приложении Prism 2 - когда пользователь нажимает кнопку в представлении, я хочу деактивировать представление. Представление выполняет команду при нажатии кнопки.

Модель представления получает команду, но модель представления не имеет ссылки на регион-менеджер.

Должна ли модель представления знать о региональном менеджере? И даже если у viewmodel была ссылка на него, ему нужно, чтобы экземпляр представления перешел к деактивному методу в содержащей области.

Я использую шаблон MVVM для приложения.

Ответы [ 3 ]

4 голосов
/ 16 марта 2009

Я пойду здесь на конечность и предположу, что вы используете для вашего региона элемент управления или что-то подобное, потому что это наиболее очевидное использование «кнопки, которая удаляет представление».

В этом случае у вас должен быть контроллер (или как вы хотите его называть, но команда Prism, похоже, использует такое имя для такого рода ответственности) где-то, отвечающий за управление активными моделями представления, и вы либо отображать ваши представления с помощью DataTemplates, или вы вручную создаете / добавляете / активируете новое представление при добавлении нового экземпляра. Ваш случай кажется вторым, и контроллер должен отвечать за управление представлениями. Ваша view-модель должна получить ссылку на этот контроллер через Dependency Injection и попросить удалить ее из пула активных моделей / представлений.

Контроллер сам получает IRegionManager и находит регион, за который он отвечает.

Надеюсь, это имеет смысл, пожалуйста, прокомментируйте, если это не так.

2 голосов
/ 26 апреля 2009

EventAggregator в вашем случае (элемент управления, который должен сам разгрузиться) может быть излишним, потому что простое введение IRegionManager в конструктор модели этого элемента управления

ctor (IRegionManager regionManager)
{
    this.RegionManager = regionManager
}

а потом как то так

this.regionManager.Regions[regionName].Remove(this.View);

должен делать то, что вы просили.

IRegionManager - это модный интерфейс, позволяющий легко тестировать, и это просто абстракция, не связывающая вас с реализацией и не включающая IoC.

0 голосов
/ 06 апреля 2009

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

Это была сложная работа по управлению этими регионами извне (скажем, из главного меню приложения), и в результате мы отказались от инфраструктуры PRISM и написали наш собственный код, основанный на элементах Composite Application Guidance, которые использовались в нашем конкретном сценарии. .

...