使用Prism框架开发WPF应用时如何在ViewModel中获取IRegionManager实例
Prism框架IRegionManager实例获取及导航修复方案
核心原理
Prism自带依赖注入容器,你已经在View中开启了prism:ViewModelLocator.AutoWireViewModel="True",Prism自动创建ViewModel实例时,会自动从DI容器中解析构造函数声明的依赖项,你代码里在构造函数中声明IRegionManager regionManager参数的写法本身是正确的,不需要额外手动获取实例。
你需要补充/修正的配置和代码
1. 补充App.xaml.cs中的视图注册
你需要在Prism应用的入口类(继承自PrismApplication的App类)的RegisterTypes方法中,注册所有需要参与导航的视图,示例如下:protected override void RegisterTypes(IContainerRegistry containerRegistry) { // 注册所有要导航的视图 containerRegistry.RegisterForNavigation<AddAssetView>(); containerRegistry.RegisterForNavigation<ConfigView>(); containerRegistry.RegisterForNavigation<DashboardView>(); }2. 修正ViewModel中的代码错误
你当前的ViewModel存在2个会导致功能失效的问题:NavigateCommand目前是字段,WPF无法绑定字段,需要改为属性- 导航方法中使用的区域名
ContentRegion和XAML中声明的MainRegion不一致,需要统一
修正后的ViewModel代码:
public class MainWindowViewModel : ViewModelBase { private readonly IRegionManager _RegionManager; // 改为属性,支持绑定 public DelegateCommand<string> NavigateCommand { get; } public MainWindowViewModel(IRegionManager regionManager) { _RegionManager = regionManager; NavigateCommand = new DelegateCommand<string>(ExecuteNavigateCommand); _RegionManager.RegisterViewWithRegion("MainRegion", typeof(DashboardView)); } private void ExecuteNavigateCommand(string viewName) { if (string.IsNullOrWhiteSpace(viewName)) return; // 区域名改为和XAML一致的MainRegion _RegionManager.RequestNavigate("MainRegion", viewName); } }
可选的手动获取方式(不推荐)
如果特殊场景需要手动获取IRegionManager实例,可以通过Prism的服务定位器直接从DI容器解析:
var regionManager = ContainerLocator.Container.Resolve<IRegionManager>();
该方式会让依赖关系不透明,非必要不要使用。
内容的提问来源于stack exchange,提问作者arne
相关产品推荐
相关产品推荐

