Prism 4.1 Как загрузить модули со сканированием каталогов и применить их к шаблону mvvm для навигации - PullRequest
0 голосов
/ 11 января 2020

В Prism 4.1 я хочу использовать загрузку модуля и построить свой проект, используя mvvm. Теперь я регистрирую модуль с помощью сканирования каталогов ,, но навигация невозможна в модели представления

код для модуля

[Module(ModuleName = "ModuleA", OnDemand = true)]
public class ModuleAModule : IModule
{
    private IRegionManager RegionManager { get; set; }
    private ViewA ViewA;

    public ModuleAModule(IRegionManager RegionManager, IUnityContainer container)
    {
        if (RegionManager != null)
        {
            this.RegionManager = RegionManager;
        }
        if (container != null)
        {
            this.container = container;
        }
    }

    public void Initialize()
    {
        this.container.RegisterType<object, ViewA>(nameof(ViewA));

        IRegion MathRegion = RegionManager.Regions["ContentRegions"];
        MathRegion.Add(this.ViewA, "ViewA");
    }
}

Затем я запускаю в Bootstrapper

 class Bootstrapper : UnityBootstrapper
{
    protected override DependencyObject CreateShell()
    {
        return ServiceLocator.Current.GetInstance<MainWindow>();
    }

    protected override void InitializeShell()
    {
        base.InitializeShell();
        Application.Current.MainWindow.Show();
    }

    protected override IModuleCatalog CreateModuleCatalog()
    {
        return new DirectoryModuleCatalog() { ModulePath = @".\Modules" };
    }
}

Я написал это в виде модели

class MainWindowViewModel : NotificationObject
{
    private readonly IRegionManager _regionManager;
    public DelegateCommand<string> NavigateCommand { get; private set; }

    public MainWindowViewModel(IRegionManager regionManager)
    {
        _regionManager = regionManager;
        NavigateCommand = new DelegateCommand<string>(Navigate);
    }

    private void Navigate(string navigatePath)
    {

        if (navigatePath != null)
            _regionManager.RequestNavigate("ContentRegion", new Uri(navigatePath, UriKind.Relative));
    }
}

Xaml в MainWindow:

<DockPanel LastChildFill="True">
    <StackPanel Orientation="Horizontal" DockPanel.Dock="Top" Margin="5">
        <Button Command="{Binding NavigateCommand}" CommandParameter="ViewA" Margin="5">NavigateCommand A</Button>
    </StackPanel>
    <TabControl prism:RegionManager.RegionName="ContentRegions" Margin="5"/>
</DockPanel>

    public MainWindow(IRegionManager region)
    {
        InitializeComponent();
        this.DataContext = new MainWindowViewModel(region);
    }

Я не могу использовать кнопки для переходите прямо сейчас, после нажатия ничего не происходит. Это потому, что я допустил ошибку при регистрации модуля? Или модуль не найден по другим причинам?

1 Ответ

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

Вы хотите зарегистрировать ViewA для навигации, а не добавлять его в регион сразу.

То есть:

container.Register<object, ViewA>( nameof(ViewA) );

, затем, при RequestNavigate, контейнер создаст новый экземпляр, и региональный менеджер поместит его в регион.

...