Prism v4 / MVVM (Unity / WPF) - загрузка модулей в один регион - PullRequest
2 голосов
/ 13 декабря 2010

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

Это пример конструкции Shell

    <StackPanel Orientation="Vertical" Grid.Column="0" Grid.Row="1">
        <Button Content="Home" Height="23" Name="Home" Width="75"/>
        <Button Content="Users" Height="23" Name="Users" Width="75"/>
    </StackPanel>
    <Border Grid.Column="1" Grid.Row="1" Background="WhiteSmoke">
        <ContentControl cal:RegionManager.RegionName="MainRegion" Name="MainRegion"/>
    </Border>

Как видите, «Меню» состоит из последовательности кнопок (это только для теста) и ContentControl, который работает как Регион, где мне нужно загрузить Представления.

Это пример того, как добавляются модули в мой Bootstraper:

    protected override void ConfigureModuleCatalog()
    {
        base.ConfigureModuleCatalog();

        System.Type homeModule = typeof(FieldCollection.Home.HomeModule);
        ModuleCatalog moduleCatalog = (ModuleCatalog)this.ModuleCatalog;
        moduleCatalog.AddModule(new ModuleInfo() { ModuleName = homeModule.Name, ModuleType = homeModule.AssemblyQualifiedName, InitializationMode = InitializationMode.OnDemand });

        System.Type userModule = typeof(FieldCollection.User.UserModule);
        moduleCatalog.AddModule(new ModuleInfo() { ModuleName = userModule.Name, ModuleType = userModule.AssemblyQualifiedName, InitializationMode = InitializationMode.OnDemand });

    }

Это метод инициализации модулей:

    public void Initialize()
    {
        this.container.RegisterType<IUserController, UserController>(new ContainerControlledLifetimeManager());
        this.regionManager.RegisterViewWithRegion("MainRegion", typeof(Views.UserSummaryView));

    }

И, наконец, так вызывается модуль из меню.

    private void User_Click(object sender, RoutedEventArgs e)
    {
        moduleManager.LoadModule("UserModule");
    }

Проблема в том, что в регионе отображается только первый вызванный вид. Я использую Prism 4 и Unity, как контейнер Dependency Injection

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

1 Ответ

2 голосов
/ 13 декабря 2010

ContentControl может содержать только один элемент, используйте ItemsControl, если вы хотите, чтобы несколько элементов отображались в одном регионе.

LoadModule(String) вызовет метод IModule.Initialize() модуля только один раз иактивируйте его в этот момент.Имейте в виду, что загрузка модулей и просмотр модулей не одно и то же.Поэтому, если вы позвоните LoadModule(String) снова, это не будет активировать представления.Модуль и представление не являются отношениями 1: 1.С модулем может быть связано несколько представлений.

Вместо этого вы можете вызвать

IRegionManager.Regions["MainRegion"].Activate(T);

... где T - это экземпляр представления, которое вы хотите отобразить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...