Как добавить модули PRISM на панель инструментов, используя MEF и MVVM - PullRequest
1 голос
/ 10 января 2012

Я использую PRISM 4.0 с MEF в качестве контейнера. Я определил 2 области, ToolBar и MainRegion в моей оболочке. Область панели инструментов автоматически заполняется моим ToolBarModule с помощью пользовательского RegionBehaviour - AutoPopulateExportedViewsBehaviour. Мой MainRegion может содержать 1 или несколько модулей View, которые будут подключены с помощью стороннего диспетчера компоновки.

У меня проблемы с созданием кнопок панели инструментов для представления доступных представлений в моем приложении. Моя идея состояла в том, чтобы использовать ToolBarService или шаблон Event, чтобы каждый модуль View мог самостоятельно регистрироваться в ToolBar.

Однако кажется, что мой конструктор View Module не вызывается, пока я не вызову RegionManager.RegisterViewWithRegion ...

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

Спасибо

Ответы [ 2 ]

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

Похоже, я могу "заставить" конструктор моего модуля представления вызываться с помощью пользовательского RegionBehaviour.Внутри этого я могу привести мой модуль представления к определенному базовому представлению или типу интерфейса и вызвать функцию a.Затем это зарегистрирует мой вид на панели инструментов, но не обязательно покажет вид в «основном» регионе моего приложения.

Спасибо за вашу помощь.

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

Как я могу контролировать инициализацию моих модулей, чтобы они могли зарегистрироваться на панели инструментов, но не показываться изначально?

Я не уверен, что вы подразумеваете под этим.

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

public void Initialize()
        {
            this.RegionManager.RegisterViewWithRegion(RegionNames.Menu, typeof(NavigationView));
            this.RegionManager.RegisterViewWithRegion(RegionNames.Toolbar, typeof(ToolbarNavigationView));
        }

В этих регионах есть реальные кнопки / элементы, которые при нажатии вызывают что-то еще. Например, здесь NavigationViewModel

namespace IDATT.Module.SystemManager.ViewModels
{
    using System;
    using System.ComponentModel.Composition;

    using Microsoft.Practices.Prism.Regions;

    [Export]
    public class NavigationViewModel
    {
        [Import]
        public ISecurityService SecurityService { get; set; }

        [Import]
        public IRegionManager RegionManager { get; set; }

        public void Mail()
        {
            this.RegionManager.RequestNavigate(RegionNames.Tabs, new Uri(typeof(MailView).Name, UriKind.Relative));
        }

        public void MaintainUser()
        {
            this.RegionManager.RequestNavigate(RegionNames.Tabs, new Uri(typeof(MaintainUserView).Name, UriKind.Relative));
        }

        public void MaintainGroup()
        {
            this.RegionManager.RequestNavigate(RegionNames.Tabs, new Uri(typeof(MaintainGroupView).Name, UriKind.Relative));
        }

        public void MaintainMailTemplate()
        {
            this.RegionManager.RequestNavigate(RegionNames.Tabs, new Uri(typeof(MaintainMailTemplateView).Name, UriKind.Relative));
        }

        public void SetUpOptions()
        {
            this.RegionManager.RequestNavigate(RegionNames.Tabs, new Uri(typeof(SetUpSystemManagerOptionsView).Name, UriKind.Relative));
        }

        public void Logout()
        {
            this.SecurityService.Logout();
        }
    }
}
...