WPF Prism框架合集(5.视图注入)

proginn468312

共 1829字,需浏览 4分钟

 ·

2021-01-06 14:32

上一章回顾

  • 什么是Module?

  • 定义Module

  • ModuleCatalog
    这一章, 我们将讲解依赖注入模块当中的视图,呈现在主窗口Shell的区域当中。

View

View通常指的是, 我们定义的页面, 而在模块化的系统当中, 我们往往称之为用户控件(UserControl)。
对于模块化系统而言, 每个模块当中都有N个用户控件组成, 然后模块向区域当中注册视图。

View Injection

在介绍Region章节当中所讲到, RegionManager的功能:

  • 维护区域集合

  • 提供对区域的访问

  • 合成视图

  • 区域导航

  • 定义区域

这意味着, 我们可以在模块当中为区域指定视图, 这个时候,我们就可以通过依赖注入的方式,使用IRegionManager接口来向指定区域注册视图:

当启动页当中定义了ContentRegion区域的时候, 将呈现ViewA。

区域访问

可以对已定义的区域进行 Add / Remove/ Activate/ Deactivate 等操作。如下所示, 关于IRegion接口:

代码定义如下所示:

View DataContext

在WPF当中,需要为View与ViewModel建立连接, 我们需要找到View的DataContext, 如下所示:

建立连接的方式

如果你使用了解WPF当中如何绑定DataContext, 你应该能想到会有下面这些方式进行:

  • XAML设置

  • Code设置 (构造函数注入 或 ViewModelLocator)

XAML的方式:

代码的方式:

如果你使用过第三方的MVVM框架, 标准的ViewModelLocator可能如下所示:

嗯...确实,这些方式都可以建立View-ViewModel关系。
但是,这一切并不是Prism想表达的内容, 甚至不建议你按上面的方式去做, 因为这样几乎打破了开发的所有原则。
(我们把View与ViewModel的关系编码的方式固定了下来, 通过静态类去维护ViewModel的关系...)

Prism ViewModelLocator

在Prism当中, 你可以基于命名约定, 便能够轻松的将View/ViewModel建议关联。如下所示:

假设你已经为项目添加Views/ViewModels文件夹。此时, 你的页面为ViewA, 则对应的ViewModel名称为 ViewAViewModel。

下面则是错误的命名方法:

当遵循了命名规范后, 是不是意味着就能够进行自动绑定? 不, 此时还需要在View当中声明,允许当前View自动装配ViewModel:

细心的你会发现, 这也就是为什么, 使用VisualStudio Tmeplate Pack创建的空白项目的时候, 为什么项目会为你默认创建Views/ViewModels文件夹。

当然, 任性的我们也可以选择不遵循这个约定, 尽管它看起来似乎也能够很好的进行工作...

更改约定

实际的开发中, 我们可能有些清空无法遵循此规则, 如下所示,我们定义Controls文件夹放View, ViewModels文件夹放ViewModel:

修改方式:
1.使用ViewModelLocationProvider设置默认视图类型指定的ViewModel。

该代码的最终意思就是,将原有的View命名控件命名改成了符合约定的命名。

2.使用ViewModelLocationProvider指定View与ViewModel的类型。

 public void RegisterTypes(IContainerRegistry containerRegistry)        {            ViewModelLocationProvider.Register();
//ViewModelLocationProvider.Register(() => new ControlAViewModel() { Text = "Hello from Factory" }); }

下一章预告

在ViewModel当中, 我们如何使用Prism当中的Binding、Command、事件聚合器等功能。

浏览 11
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报