
2.DI(依赖注入)
以下是框架内自动注入的,也就是说在ViewModel中的构造函数可以直接使用,不需要再APP.CS中注册
比如像这个样,构造函数可以随便使用
public MainWindowViewModel(IRegionManager regionManager, IModuleManager moduleManager, IEventAggregator eventAggregator, IDialogService aaa)
| 类别 | 具体内容(按平台) | 生命周期 | 核心用途 |
|---|---|---|---|
| 核心内置服务(全平台) | IEventAggregator(事件聚合器) |
单例 | 跨组件通信 |
INavigationService(导航服务) |
瞬时 | 页面 / View 导航 | |
IDialogService(弹窗服务) |
单例 | 标准化弹窗管理 | |
IContainerRegistry/IContainerProvider(DI 容器接口) |
单例 | 注册 / 解析服务 | |
| WPF 专属内置服务 | IRegionManager(区域管理器) |
单例 | 管理 WPF 的 Region 容器 |
IModuleManager/IModuleCatalog(模块管理) |
单例 | 模块化加载 / 管理 | |
| 框架内部基础设施 | ViewModelLocator、导航管道、容器内部组件 | 内部管理 | 框架底层运行(无需关注) |
还有一种自定义的方式需要手动注册,再App.cs中
containerRegistry.Register<IUserService, UserService>(); // 瞬时(默认) containerRegistry.RegisterSingleton<ISettingsService, SettingsService>(); // 单例 containerRegistry.Register<LocalDataCache>(); // 无接口的具体类型
3. View 与 ViewModel 的自动关联注册
如果 View(OrderView)和 ViewModel(OrderViewModel)满足「同命名空间 + View 后缀 / ViewModel 后缀」,Prism 的ViewModelLocator可自动关联,无需手动注册;
但是prism项目模板是不在同一个命名空间内,二十遵循了精准利用了 Prism 的扩展约定。
prism:ViewModelLocator.AutoWireViewModel="True" 这个二是自动关联开关;绑定上下文
小技巧添加以下代码,可再Xaml界面中使用转到定义功能
<!-- 1. 引入设计时命名空间(固定) -->xmlns:d="http://schemas.microsoft.com/expression/blend/2008"<!-- 2. 引入ViewModel命名空间(替换为你的实际命名空间) -->xmlns:vm="clr-namespace:YourApp.ViewModels"<!-- Prism自动装配(运行时生效) -->prism:ViewModelLocator.AutoWireViewModel="True"<!-- 3. 设计时DataContext(仅给VS看,不影响运行) -->d:DataContext="{d:DesignInstance Type=vm:OrderViewModel, IsDesignTimeCreatable=False}"
4.