WPF框架Prism中使用MVVM架构

常见的MVVM框架

众所周知, 如果你了解WPF当中的ICommand, INotifyPropertyChanged的作用, 就会发现众多框架都是基于这些进行扩展, 实现其通知、绑定、命令等功能。

对于不同的MVVM框架而言, 大体使用上会在声明方式上的差异, 以及特定功能上的差别。

下面列举了常用的3个MVVM框架,他们的一些差异。如下所示:

功能↓ / →框架名 Prism Mvvmlight Micorosoft.Toolkit.Mvvm
通知 BindableBase ViewModelBase ObservableObject
命令 DelegateCommand RelayCommand Async/RelayCommand
聚合器 IEventAggregator IMessenger IMessenger
模块化 × ×
容器 × ×
依赖注入 × ×
导航 × ×
对话 × ×

正如你所见, 各个框架之间都有各自的通知、绑定、事件聚合器等基础的功能, 而Prsim自带的依赖注入、容器、以及导航会话等功能, 可以为你提供更加强大的功能。

当然,在实际的开发过程当中, 可以根据实际的功能需求, 对不同的框架选型, 同时这也需要你对各个框架之间的优缺点进行判断。

那么, 下面将主要介绍Prism当中的通知、绑定等功能。

BindableBase

如果在此之前, 你用类型mvvmlight框架, ViewModel继承的类如下:

    public class TestViewModel : ViewModelBase
    {
        private string _message;

        public string Message
        {
            get { return _message; }
            set { _message = value; RaisePropertyChanged(); }
        }
    }

在Prism当中, 你需要继承于BindableBase, 如下所示:

    public class TestViewModel : BindableBase
    {
        private string _message;

        public string Message
        {
            get { return _message; }
            set { _message = value; RaisePropertyChanged(); }
        }
    }

Command

在mvvmlight/microsoft.toolkit.mvvm中, 声明Command,如下:

    public class TestViewModel : ViewModelBase
    {
        public RelayCommand SendCommand { get; set; }

        public RelayCommand<string> SendMessageCommand { get; set; }
    }

在Prism当中, 你可以使用DelegateCommand及带参数的Command, 如下:

    public class TestViewModel : ViewModelBase
    {
        public DelegateCommand SendCommand { get; set; }

        public DelegateCommand<string> SendMessageCommand { get; set; }
    }

CompositeCommand

对于单个Command而言, 只是触发单个对应的功能, 而复合命令是Prism当中非常强大的功能, CompositeCommand简单来说是一个父命令, 它可以注册N个子命令, 如下所示:

当父命令被激活, 它将触发对所有的子命令, 如果任意一个命令CanExecute=false,它将无法被激活,如下所示:

IEventAggregator

  • 松耦合基于事件通讯
  • 多个发布者和订阅者
  • 微弱的事件
  • 过滤事件
  • 传递参数
  • 取消订阅

该功能主要作用为, 事件聚合器负责接收订阅以及发布消息。订阅者可以接收到发布者发送的内容。

例如: AViewModel订阅了一个消息接收的事件, 然后BViewModel当中给指定该事件推送消息,此时AViewModel接收BViewModel推送的内容。如下所示:

示例,下面演示如何创建订阅及发布:

//创建事件
public class SavedEvent : PubSubEvent<string> { }

//发布
IEventAggregator.GetEvent<SavedEvent>().Publish("some value");

//订阅
IEventAggregator.GetEvent<SavedEvent>().Subscribe(.Subscribe(message=>
            {
                //do something
            });

Filtering Events

在实际的开发过程当中,我们往往会在多个位置订阅一个事件, 但是对于订阅者而言, 他并不需要接收任何消息, 如下所示:

在Prism当中, 我们可以指定为事件指定过滤条件, 如下所示:

eventAggregator.GetEvent<MessageSentEvent>()
               .Subscribe(arg =>
               {
                   //do something
               },
               ThreadOption.PublisherThread,
               false,
               //设置条件为token等于“MessageListViewModel” 则接收消息
               message => message.token.Equals(nameof(MessageListViewModel)));

关于Subscribe当中的4个参数, 详解:

  • 1.action: 发布事件时执行的委托。
  • 2.ThreadOption枚举: 指定在哪个线程上接收委托回调。
  • 3.keepSubscriberReferenceAlive: 如果为true,则Prism.Events.PubSubEvent保留对订阅者的引用因此它不会收集垃圾。
  • 4.filter: 进行筛选以评估订阅者是否应接收事件。

Unsubscribe

为注册的消息取消订阅, Prism提供二种方式取消订阅,如下:

1.通过委托的方式取消订阅

var event = IEventAggregator.GetEvent<MessageSentEvent>();

event.Subscribe(OnMessageReceived);

event.Unsubscribe(OnMessageReceived);

2.通过获取订阅者token取消订阅

var _event = eventAggregator.GetEvent<MessageSentEvent>();

var token = _event.Subscribe(OnMessageReceived);

_event.Unsubscribe(token);

到此这篇关于WPF框架Prism中使用MVVM架构的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • WPF框架Prism中导航Navigation用法介绍

    使用场景 在普遍的业务场景当中, 必不可少的是页面切换, 而Prism就可以使用Navigation功能来进行页面导航, 在不同的场景当中会有各种用法, 例如在切换页面验证.传递参数.返回上一页.返回下一页等功能. 导航的基本条件 1.注册显示区域 2.注册导航页面 1.注册导航 注册视图类型或添加别名, 如果为指定别名,名称默认为当中类型的名称 public class ModuleAModule : IModule { public void OnInitialized(IContainer

  • WPF框架之Prism介绍

    什么是Prism? Prism是一个用于在 WPF.Xamarin Form.Uno 平台和 WinUI 中构建松散耦合.可维护和可测试的 XAML 应用程序框架. Prism历史 他最初由Microsoft Patterns & Practices 团队构建的项目, 目的是帮助WPF开发人员以简化编写.维护和扩展来设计应用程序.目前它是属于.NET基金会下的一个开源项目.并且经过财富100强等公司的多年的实践考验. Github https://github.com/PrismLibrary/

  • WPF创建Prism应用程序

    创建Prism应用程序 1.第一步 首先, 创建一个基于.NetFramework 或.NetCore的WPF应用程序.如下所示: 2.第二步 为当前应用程序添加NuGet源, 打开NuGet管理器,安装Prism.DryIoc, 如下所示: 说明: 本文将以DryIoc容器为主讲解本系列的所有内容. 实际上, 在Prism7.2版本中, 已经引入了一些围绕IOC抽象的API更改.这最终将使得在选择容器之间切换更加容易,因为 API 在如何注册服务和视图方面完全相同. 您仍然可以访问容器,在 A

  • WPF框架Prism中ViewModelLocator用法介绍

    建立连接 在WPF当中,需要为View与ViewModel建立连接, 我们需要找到View的DataContext, 如下所示: 建立连接的方式 如果你使用了解WPF当中如何绑定DataContext, 你应该能想到会有下面这些方式进行: XAML设置 Code设置 (构造函数注入 或 ViewModelLocator) XAML的方式: <UserControl.DataContext> <.../> </UserControl.DataContext> 代码的方式:

  • WPF框架Prism中区域Region用法介绍

    什么是区域(Region)? 在理解这个之前, 首先需要了解一下, 在最常见的开发模式当中, 我们去设计某个页面的时候, 实际上界面元素在设计的时候已经被固定. 举个简单的例子,当我们去设计如下页面, 它包含Header.Menu.Content内容. 因此我们可以为这个页面设计一些元素, 例如: 1.Menu 可以放置ListBox 2.Content 可以放置一个ContentControl 3.Header 可以放置一些ToolBar 注:为了演示需要, 对应区域的控件均采用TextBlo

  • WPF框架Prism中对话框Dialog用法介绍

    什么是Dialog? 对话框实际上是我们应用程序经常用到的一个功能, 类如: Show.ShowDialog. 可以弹出一个我们指定的窗口, 仅此而已, 那么在Prism当中, Dialog指的是什么? Prism提供了一组对话服务, 封装了常用的对话框组件的功能, 例如: RegisterDialog/IDialogService (注册对话及使用对话) 打开对话框传递参数/关闭对话框返回参数 回调通知对话结果 创建Dialog流程 创建对话框,通常是一组用户控件 ,并且实现 IDialogA

  • WPF框架Prism中模块Module用法

    什么是模块(Module)? 本质上来说, 对于一个应用程序而言, 特定功能的所有View.Logic.Service等都可以独立存在.那么意味着, 每个独立的功能我们都可以称之为模块.而往往实际上, 我们在一个项目当中, 他的结构通常是如下所示: 所有的模块都在一个项目当中, 这使得应用程序当中, 我们难以区分单独的模块, 它们似乎变成了一个整体. 所以,当我们开始考虑划分模块之间的关系的时候, 并且采用新的模块化解决方案, 它的结构将变成如下所示: 该项目包含了一个启动页, 并且在启动页当中

  • WPF框架Prism中View Injection用法介绍

    View View通常指的是, 我们定义的页面, 而在模块化的系统当中, 我们往往称之为用户控件(UserControl).对于模块化系统而言, 每个模块当中都有N个用户控件组成, 然后模块向区域当中注册视图. View Injection 在介绍Region章节当中所讲到, RegionManager的功能: 维护区域集合 提供对区域的访问 合成视图 区域导航 定义区域 这意味着, 我们可以在模块当中为区域指定视图, 这个时候,我们就可以通过依赖注入的方式,使用IRegionManager接口

  • WPF框架Prism中使用MVVM架构

    常见的MVVM框架 众所周知, 如果你了解WPF当中的ICommand, INotifyPropertyChanged的作用, 就会发现众多框架都是基于这些进行扩展, 实现其通知.绑定.命令等功能. 对于不同的MVVM框架而言, 大体使用上会在声明方式上的差异, 以及特定功能上的差别. 下面列举了常用的3个MVVM框架,他们的一些差异.如下所示: 功能↓ / →框架名 Prism Mvvmlight Micorosoft.Toolkit.Mvvm 通知 BindableBase ViewMode

  • 为WPF框架Prism注册Nlog日志服务

    无论是Nlog还是Serilog, 它们都提供了如何快速在各类应用程序当中的快速使用方法. 尽管,你现在无论是在WPF或者ASP.NET Core当中, 都可以使用ServiceCollection来做到着一点, 因为日志框架都提供了IServiceCollection的扩展. 但是, 如果现在你使用的是Prism 8.0的应用程序, Prism提供了多种容器的支持, 例如:DryIoc或者Unity, 这个时候我们如果现在这个基础上实现依赖注入,首先我们需要修改Prism当中创建容器的默认实现

  • WPF使用ValidationRules对MVVM架构数据验证

    对于WPF中的验证, View验证实现起来很简单, 可以通道 Validation.ErrorEvent 冒泡传递到View的逻辑树上, 只是, 通常这样做的情况下, 我们需要为View添加事件代码监听这类错误事件, 然后进行处理. 这样做可以说是非常简单, 但是这样的硬编码的, 基本上每个模块每个功能, 你都必不可少的为其进行重复的工作, 这是一项非常枯燥且无聊的体力活! 于是, 则考虑MVVM的架构中, 如何把这种模式传递到ViewModel中, 使得前端的验证, 对于ViewModel仍然

随机推荐