Навигация между лениво загруженными модулями с помощью Prism и WPF - PullRequest
1 голос
/ 03 февраля 2020

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

Для достижения этого в моем app.xaml.cs один модуль загружается в bootstrap время (MainModule), а другой имеет InitializationMode = InitializationMode.OnDemand

    protected override void ConfigureModuleCatalog(IModuleCatalog moduleCatalog)
    {

        Type BlipModuleType = typeof(BlipModule);
        moduleCatalog.AddModule(new ModuleInfo()
        {
            ModuleName = BlipModuleType.Name,
            ModuleType = BlipModuleType.AssemblyQualifiedName,
            InitializationMode = InitializationMode.OnDemand
        });

        moduleCatalog.AddModule<MainModule>();
    }

, затем мой Основной модуль, который отображает представление правильно, имеет единственный вид, зарегистрированный для единственного доступного региона:

    public class MainModule : IModule
    {

        private readonly IRegionManager _regionManager;

        public MainModule(IRegionManager regionManager)
        {
            _regionManager = regionManager;
        }
        public void OnInitialized(IContainerProvider containerProvider)
        {
            _regionManager.RegisterViewWithRegion(RegionNames.ContentRegion, typeof(ViewA));
        }

        public void RegisterTypes(IContainerRegistry containerRegistry)
        {
        }
    }

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

    public class BlipModule : IModule
    {
        private readonly IRegionManager _regionManager;

        public BlipModule(IRegionManager regionManager)
        {
            _regionManager = regionManager;

        }
        public void OnInitialized(IContainerProvider containerProvider)
        {
            _regionManager.RegisterViewWithRegion(RegionNames.ContentRegion, typeof(ViewB));

        }

        public void RegisterTypes(IContainerRegistry containerRegistry)
        {
        }
    }

наконец-то у меня есть команда в viewmodel моего MainModule ViewA, которая должна загрузить новый модуль и перейти к нему.

public class ViewAViewModel : BindableBase
{
    const string BlipModuleName = "BlipModule";

    public ReactiveCommand ChangeRoute { get; set; } = new ReactiveCommand();

    public ViewAViewModel(IRegionManager regionManager, IModuleManager moduleManager)
    {
        ChangeRoute.Subscribe(res =>
        {
            moduleManager.LoadModule(BlipModuleName);
        });

        moduleManager.LoadModuleCompleted += (s, e) =>
        {
            if (e.ModuleInfo.ModuleName == BlipModuleName)
            {
                regionManager.RequestNavigate(RegionNames.ContentRegion, new Uri(BlipModuleName, UriKind.Relative));
            }
        };
    }

}

ViewB BlipModule фактически загружен (я получаю удар, если я устанавливаю точку останова в конструкторе представления), но вместо представления я получаю белую страницу с "System.Object" внутри него. Есть идеи? спасибо!

1 Ответ

0 голосов
/ 03 февраля 2020

Вы хотите RegisterForNavigation вместо RegisterViewWithRegion.

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