Win Forms MVVM 2020-08-18

Win Forms MVVM

DevExpress MVVM Framework允许您在WinForms应用程序中利用Model-View-ViewModel设计模式。该框架的文档包括以下几章。

讲解

按照分步教程创建一个示例数据感知“费用”应用程序。

概念

包含有关关键MVVM概念的深入信息,包括可绑定属性,命令,UI触发器和值转换器。

设计时支持

了解DevExpress MVVM框架的设计时功能,这些功能旨在加速应用程序开发。

什么是MVVM,为什么要使用它?

Model-View-ViewModel(MVVM)是为WPF开发而设计的,是一种体系结构设计模式,它将您的应用程序分为三层,组成该模式的标题。

  • 模型 -定义数据和您的业务逻辑。
  • 视图 -指定UI,包括绑定到ViewModel中的属性和命令的所有可视元素(按钮,标签,编辑器等)。
  • ViewModel-连接模型和视图。该层是View的抽象,它公开了用于将数据绑定到GUI元素并管理此数据的公共属性和命令。

下图说明了这些层及其通信方式。
在这里插入图片描述

WinForms MVVM-通用MVVM方案

这种分离为您带来了多项好处,例如为开发人员和设计人员提供了更独立的开发流程,更轻松的代码测试或更简单的UI重新设计。请参阅此MSDN文章,以了解有关此模式及其提供的好处的更多信息。

#Win Forms应用程序中的MVVM :问题和选项
没有第三方MVVM框架的WinForms平台缺少诸如敏捷数据绑定或可绑定命令之类的要素。要遵循MVVM原理,您将必须手动实现这些功能,从而创建一个附加的层-Presenter。通常,此层包括UserControls及其背后的代码,自定义View元素的方法,事件处理程序和绑定。

DevExpress MVVM框架为所有这些功能提供内置支持,因此无需使用额外的工作负载即可使用WinForms进行纯MVVM开发。另外一个好处是,它与应用程序中已经在使用的DevExpress WinForms UI控件很好地集成在一起。

以下是一些受支持的功能和优点。

  • 灵活的数据绑定
  • 命令和命令绑定
  • 行为与服务
  • 一种实现通知和命令的高级方法
  • MVVM上下文组件,该组件管理从创建ViewModel到注册DevExpress服务的所有内容
  • 简单(POCO)类支持
  • 与其他DevExpress WinForms控件的丰富互操作性
  • 模板库模板,专门为MVVM应用程序创建
  • 流利的API和数据注释属性支持
  • 各种设计时间功能

也可以看看
概念
设计时支持
讲解

MVVM模式-MSDN

MVVM模式自然适合XAML应用程序平台,例如Silverlight。这是因为MVVM模式利用了Silverlight的某些特定功能,例如数据绑定,命令和行为。MVVM与许多其他模式相似,它们将UI的外观和布局的责任与表示逻辑的责任分开了。例如,如果您熟悉Model-View-Controller(MVC)模式,则会发现MVVM具有许多相似的概念。

MVVM模式的动机

Windows Forms,WPF,Silverlight和Windows Phone等开发技术提供了默认的体验,使开发人员可以将控件从工具箱拖到设计图面,然后在表单的代码隐藏文件中编写代码。随着此类应用程序的规模和范围不断扩大并对其进行修改,开始出现复杂的维护问题。这些问题包括UI控件和业务逻辑之间的紧密耦合,这增加了进行UI修改的成本,以及对此类代码进行单元测试的难度。

使用MVVM模式实现应用程序的主要动机是:

  1. 它提供了关注点分离。紧密耦合的,耐更改的,易碎的代码会导致各种长期维护问题,最终导致客户对交付的软件不满意。应用程序逻辑和UI之间的明确分隔将使应用程序更易于测试,维护和发展。它增加了代码重用的机会,并启用了开发人员-设计师的工作流程。
  2. 这是XAML平台的自然模式。MVVM模式的关键推动因素是Silverlight平台的丰富数据绑定堆栈以及依赖项属性。这些的组合提供了将UI连接到视图模型的方法。
  3. 它启用了开发人员-设计师的工作流程。当UI XAML没有与背后的代码紧密结合时,设计人员可以轻松地行使创造力和生产优质产品所需的自由。
  4. 它提高了应用程序的可测试性。将UI逻辑移动到可以独立于UI技术实例化的单独的类,可以使单元测试变得更加容易。

MVVM模式

Model-View-ViewModel模式可以在所有XAML平台上使用。其目的是在用户界面控件及其逻辑之间提供明确的关注点分离。

MVVM模式中包含三个核心组件:模型,视图和视图模型。每一个都扮演着不同的角色。下图显示了这三个组件之间的关系。

在这里插入图片描述

组件彼此分离,从而实现:

  • 要交换的组件
  • 在不影响其他实施的前提下更改内部实施
  • 要独立处理的组件
  • 隔离单元测试

除了了解这三个组件的职责外,了解组件之间如何交互也很重要。在最高级别,视图“了解”视图模型,视图模型“了解”模型,但模型不了解视图模型,而视图模型不了解视图。

视图模型将视图与模型类隔离开,并允许模型独立于视图进行演化。

视图

该视图负责定义用户在屏幕上看到的内容的结构,布局和外观。理想情况下,视图是完全由XAML定义的,并且背后的代码有限,其中不包含业务逻辑。

在Windows Phone应用程序中,视图通常是应用程序中的页面。此外,视图可以是父视图的子组件,也可以是ItemsControl中对象的DataTemplate

视图可以具有自己的视图模型,也可以继承其父视图模型。视图通过绑定或在视图模型上调用方法从其视图模型获取数据。在运行时,当UI控件响应视图模型属性并引发更改通知事件时,视图将发生更改。

响应于视图上的交互,有多个选项可用于在视图模型上执行代码,例如单击按钮或选择项目。如果控件是Command Source,则控件的Command属性可以数据绑定到视图模型上的ICommand属性。调用控件的命令后,将执行视图模型中的代码。除了命令之外,行为还可以附加到视图中的对象上,并且可以侦听要调用的命令或引发的事件。作为响应,该行为随后可以在视图模型上调用ICommand或在视图模型上调用方法。

模型

MVVM中的模型是应用程序领域模型的实现,其中包括数据模型以及业务和验证逻辑。模型对象的示例包括存储库,业务对象,数据传输对象(DTO),普通旧CLR对象(POCO)以及生成的实体和代理对象。

查看模型

视图模型充当视图和模型之间的中介,并负责处理视图逻辑。通常,视图模型通过调用模型类中的方法与模型交互。然后,视图模型以视图可以轻松使用的形式提供来自模型的数据。视图模型从模型中检索数据,然后使数据可用于视图,并且可以通过某种方式重新格式化数据,从而使视图更易于处理。视图模型还提供了应用程序的用户在视图中启动的命令的实现。例如,当用户单击UI中的按钮时,该操作可以触发视图模型中的命令。视图模型还可能负责定义影响视图中某些方面的逻辑状态更改,

为了使视图模型参与与视图的双向数据绑定,其属性必须引发PropertyChanged事件。

视图模型通过实现INotifyPropertyChanged接口并在属性更改时引发PropertyChanged事件来满足此要求。侦听器可以在发生属性更改时对其做出适当的响应。

对于集合,提供了视图友好的System.Collections.ObjectModel.ObservableCollection 。此集合实现集合更改通知,从而使开发人员不必在集合上实现INotifyCollectionChanged接口。

将视图模型连接到视图

MVVM利用Silverlight中的数据绑定功能来管理视图和视图模型之间的链接以及行为和事件触发器。这些功能限制了将业务逻辑放置在视图代码背后的需求。

有很多方法可以将视图模型连接到视图,包括直接关系和基于容器的方法。但是,所有对象都具有相同的目标,即为视图分配一个分配给其DataContext属性的视图模型。

可以将视图连接到代码隐藏文件或视图本身中的视图模型。

代码隐藏

视图可以在代码隐藏文件中包含代码,从而导致视图模型被分配为其DataContext属性。这可以像视图实例化一个新视图模型并将其分配给其DataContext一样简单,或者使用控制反转容器将视图模型注入视图中。

但是,不建议将视图模型连接到代码隐藏文件中的视图,因为这会给Visual Studio和Microsoft ExpressionBlend®设计软件中的设计人员造成问题。

视图

如果视图模型没有任何构造函数参数,则可以在视图中将视图模型实例化为视图的DataContext。执行此操作的常用方法是使用视图模型定位器。这是一种资源,它将应用程序的视图模型公开为单个视图可以数据绑定到的属性。这种方法意味着应用程序只有一个类,负责将视图模型连接到视图。此外,它仍然使开发人员可以选择在视图模型定位器中手动执行连接,也可以使用依赖项注入容器。

MVVM的好处

MVVM支持出色的开发人员-设计师工作流程,具有以下优点:

  • 在开发过程中,开发人员和设计人员可以在其组件上更独立地同时进行工作。设计人员可以将精力集中在视图上,如果他们使用的是Expression Blend,则他们可以轻松地生成要使用的示例数据,而开发人员可以使用视图模型和模型组件。
  • 开发人员可以为视图模型和模型创建单元测试,而无需使用视图。视图模型的单元测试可以行使与视图所使用的功能完全相同的功能。
  • 由于视图完全在XAML中实现,因此无需触摸代码即可轻松重新设计应用程序的UI。视图的新版本应与现有视图模型一起使用。
  • 如果模型的现有实现封装了现有的业务逻辑,则可能很难更改或冒险。在这种情况下,视图模型充当模型类的适配器,并使您能够避免对模型代码进行任何重大更改。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值