c# - Prism 4.1 如何使用目录扫描加载模块并将它们应用于 mvvm 模式以进行导航
问题描述
在 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:
<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);
}
我现在无法使用按钮导航,单击后没有任何反应。是不是因为我注册模块的时候出错了?还是因为其他原因找不到模块?
解决方案
您想注册ViewA
导航,而不是立即将其添加到区域。
那是:
container.Register<object, ViewA>( nameof(ViewA) );
然后,RequestNavigate
容器将创建一个新实例,区域管理器将其放入该区域。
推荐阅读
- java - 如何使用 Apache Camel Netty4 在异步模式下通过已建立的 TCP 连接发回响应?
- ios - 安全区域不移动物品
- batch-file - 根据输入参数的数量在批处理脚本中循环
- corda - 实施法律散文模板
- linux - 在linux上安装red5的问题
- java - 等待 / notifyAll 没有按预期工作
- java - 为 Spring Boot 2.0 acuator 框架配置安全性
- php - 下订单前的 WooCommerce 电话号码验证
- scala - Dotty 提供什么来替换类型投影?
- r - 点击事件和渲染图之间的R Shiny Reactive无限循环