模块注入框架(MIF)是一组帮助MVVM应用程序的类。它提供以下功能
- 将ViewModel连接到视图
- 页面之间导航
- 保存和恢复应用程序的可视和逻辑状态
- 单元测试
模块
模块是应用程序的功能单元。关于模块注入框架(MIF),模块是将ViewModel绑定到其视图的结构。每个模块实现IModule接口。
本主题介绍如何注册和控制模块
基本信息
IModule 接口如下所示
public interface IModule {
string Key { get; }
Func<object> ViewModelFactory { get; }
string ViewModelName { get; }
string ViewName { get; }
Type ViewType { get; }
}
MIF提供了一个快速的IModule实现-模块类。使用模块管理器注册方法和模块
ModuleManager.DefaultManager.Register(
regionName: "RegionA",
module: new Module(
key: "Module1",
viewModelFactory: () => new Module1ViewModel(),
viewType: typeof(Module1View)
)
);
您可以通过其键显示 、激活或删除已注册的模块
ModuleManager.DefaultManager.Inject(regionName: "RegionA", key: "Module1");
ModuleManager.DefaultManager.Navigate(regionName: "RegionA", key: "Module1");
ModuleManager.DefaultManager.Remove(regionName: "RegionA", key: "Module1");
模块创建
模块类提供了多个构造函数
/*1.*/ new Module(key: "Module1", viewModelFactory: () => new ModuleViewModel());
/*2.*/ new Module(key: "Module1", viewModelFactory: () => new ModuleViewModel(), viewType: typeof(ModuleView))
/*3.*/ new Module(key: "Module1", viewModelFactory: () => new ModuleViewModel(), viewName: "ModuleView")
/*4.*/ new Module(key: "Module1", viewModelName: "ModuleViewModel", viewName: "ModuleView")
-
第一种方法不包含有关View的信息,并且它设置在目标控制级别,例如:
<ContentPresenter dxmvvm:UIRegion.Region="RegionA" ContentTemplate="{StaticResource ModuleTemplate}"/>
当您 注入模块1时,MIF将创建模块视图模型实例,并将其传递到目标控件
-
第二种方法设置ViewType参数。在这种情况下,MIF为目标审控件创建一个特殊的DataTemplateSelector,该控件基于视图模型选择模块
<ContentPresenter dxmvvm:UIRegion.Region="RegionA"/>
//This code is a sketch for demonstration purposes. class ViewDataTemplateSelector : DataTemplateSelector { string Module1ViewTemplate = " <DataTemplate> <ModuleView/> </DataTemplate>"; public override DataTemplate SelectTemplate(object viewModel) { if(viewModel is ModuleViewModel) return new DataTemplate(Module1ViewTemplate); return null; } } targetContentControl.ContentTemplateSelector = new ViewDataTemplateSelector();
-
第三种方法与第二种方法类似。如果您无法访问“视图”类型,可以使用它
-
如果您无法访问ViewModel类型,请使用最后一种方法。