wpf数据驱动的设计思想和wonform事件驱动的对比

 WPF - 本质:数据和行为

    简述: Windows Presentation Foundation  中文译为“Windows呈现基础”。

   WPF是Windows操作系统中一次重大变革,与早期的GDI+/GDI不同。WPF是基于DirectX引擎的,支持GPU硬件加速,在不支持硬件加速时也可以使用软件绘制。高级别的线程绘制可以提高使用者的体验。自动识别显示器分辨率并进行缩放。而Vista就是一个非常典型的例子。

  1. UI本质 
  •  先从UI上分析,UI的功能是让用户观察和操作数据,为了能显示数据和响应用户的操作通知程序(通过事件来通知,如何处理事件又是一系列的算法),所以控件就是显示数据和响应用户操作的UI元素,也即:控件就是数据和行为的载体。
  • 一个是数据展现,另一个就是数据操作,也就是UI框架的数据(Data)和行为(Behavior)。
  • 数据驱动UI       什么是数据驱动UI呢?我们知道传统的GUI界面都是由windows消息通过事件传递给程序,程序根据不同的操作来表达出不同的数据体现在UI界面上,这样数据在某种程度上来说,受到很大的限制。WPF中是数据驱动UI,数据是核心,处于主动的,UI从属于数据并表达数据,是被动的。WPF数据第一,控件第二。

   2.数据(Data)

   以前的UI框架的控件对控件数据类型都有规定,按钮上显示的是文本或者加上一个图片,下拉框显示的都是字符串或者带上一个object类型属性的作为保存 对象引用用。而WPF则不同,它缺省的数据类型为object,这就允许控件能够操作任意类型的数据,这也是它灵活和强大的地方之一。

  • 数据类型
  • 原始数据:字符串、布尔、整形等
  • 列表数据:数组、列表等,集合中的内容可以是相同类型或者不同类型的数据
  • 层级数据:树、列表的列表或者图等,具有层级关系的数据
  • 组合数据:包含以上多种数据的数据,如用户联系方式包括电话、地址1、地址2、手机号等。

  但是如果是object类型,那WPF如何知道具体该如何显示这些数据呢?这就要通过Templates、Presenters、Binding and Converters、Layout和Styles了。

  • 模板(Templates)
  •  控件模板(control template):控件模板定义一个控件的外观,这个控件主要和UI相关,一般也不和Data有关。每个控件都有个一个缺省的控件模板。
  • 数据模板(data template):数据模板负责定制任何一个.Net对象的外观,这对于非UIElement控件非常重要,非UIElement控件的默认模板仅仅是一个TextBlock,其中包含了一个由ToString方法反会的字符串。
  • 内容控件(Presenters):  通过Templates讲解,我们现在知道控件模板定义控件外观,数据模板定义特定的数据如何显示,那么现在如何将定义的数据显示在控件外观上显示呢?那就需要content presenter了。每个控件都有一个默认的ContentPresenter用于显示Content内容,我们称这种控件为内容控件,ContentPresenter负责将ContentControl的Content属性显示出来。

  3.绑定(Binding) 和 转换(Converters)
 

    数据模板描述了数据显示的外观,我们如何使得这些外观和数据关联起来呢?这就是数据绑定(data binding)来做的事情。WPF的数据绑定是一个强大的功能,它允许单项和双向的绑定,当对象更改时UI会自动刷新,当UI操作后数据也可以自动更改。
有时候数据的格式并不只是简答的显示,比如bool类型需要显示成三态,可以通过一个转换器来实现。 

  Binding和Converters代码示例:网上很多这个资料,可以参考WPF Data Binding、Binding Converters

4. 布局(Layout)
  经过前面的步骤,模板已经定义了,数据也有了,转换器和绑定也触发了,内容显示也生成了,剩下最后一步就是布局(layout)。布局系统将确定前面生产的所有UI控件的大小和位置。在WPF中panel以及其继承类负责提供layout功能。

       布局是一种递归的分两个步骤进行的过程,第一步叫做检测(measuer),第二步叫做排列(arrange)。

检测:面板询问其子元素到底需要多少空间,这里假设有足够的控件。面板会重载FrameworkElement的MeasureOverride方法来实现这一步。
排列:在检测步骤完成后,就该排列元素了。面板会告诉子元素它们将放在哪里,它们有多少空间可以用。面板会重载FramworkElement的ArrangeOverride方法来实现这一步骤。


5.样式(Style)
  样式是一种简单的机制,通过它可以把属性值和用户界面元素分类开来,有点类似CSS与HTML的关系

以上内容可以表达为下图:Person数据经过控件模板、数据模板以及样式和布局,再加上数据绑定就可以展现数据了。

6. 行为(Behavior)
把数据显示出来只是做了一半工作,还有一半就是提供用户方式与UI进行交互。下图说明了输入操作示意图:

WPF控件支持鼠标、键盘和写字板等输入设备来与UI进行交互,还可以通过外部和内部时间进行操作,经过触发后可以通过事件处理或者command机制来进行Action

# 数据驱动和时间驱动的比较

Asp.net 等技术使用的都是事件驱动的理念,事件驱动,通过事件订阅事件处理的关系,组织应用程序事件驱动下,用户进行每一个操作都会激发程序,发生对应的一个事件,事件发生之后,用于响应事件。事件处理器就会执行事件驱动呢,其实也是对应着Mvc 模式进行使用的一个形式,例如对应于一个计算器文件,当我们按下一个等于号按钮的时候,按钮按下这个事件就会被触发,通过Control 找到对应用于运算的Model 来执行运算操作,不难发现事件驱动下,界面控件是处于主动地位的界面,逻辑与业务逻辑之间的桥梁,是事件界面,逻辑与业务逻辑多多少少都会有关联性依赖性,而数据是处于被动地位的,是静态的,等待着控件的事件去驱动,他们当世界逻辑变得多,而且复杂的时候,代码就会很容易变得复杂难懂,遇到Bug 的时候也难以排除.

MvVM 模式,就是典型的利用数据驱动的形式.

   当Model 数据发生变化时,VIEW model 的观察者会监听到这个变化,并通知建立控件,推动,建立控件展示最新的数据;

当用户对控件进行操作带来数据变更时,通过双向数据绑定会更新在Model 中的数据,在这个过程当中,控件和控件事件对程序的控制会被弱化,他们只参与页面逻辑,而不再主导业务逻辑,可见在数据驱动的理念下,数据占主动地位,也就是由内容去决定形式,事件驱动的桥梁是事件,而数据驱动的桥梁是双向数据绑定,通过Data binding 可以实现数据流向界面界面,也可以将数据流回数据源.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

是刘彦宏吖

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值