[原创译文][MVVM专题]__Advanced MVVM 第二章

 Advanced MVVM [中英文全集]:

原文(E文): Advance MVVM

第一章: 全文简介

第二章:简要概述WPF和MVVM

第三章:View架构简介

第四章:ViewModel架构简介

第五章:Animated Transitions

第六章:Animated Transitions 下的无限制撤销实现

第七章:Game-Over对话框

第八章:回顾

作者: Kingmoon

转载请注明: http://www.cnblogs.com/kingmoon

 

第二章__简要概述WPF和MVVM

      这一章是为了帮助哪些WPF或者MVVM新手大概了解整篇WPF和MVVM的蓝图. 当然对于老手,这部分也是十分有趣的,你可以从一个不同的角度重新看类似的主题. 所有后续的章节都是面向那些大致了解了WPF和MVVM的读者.如果你不想或者不需要读这一章,你可以直接跳过.

WPF

      Microsoft’s Windows Presentation Fundation(WPF) 是运作在.Net Framework的用户界面编程平台, 他有非常多的特性, 我们不需要每个特性都了解, 相反地, 我们应该关注那些有关于Bubble Burst如何运作的重点特性.

     关于本书我们需要了解最重要的特性是: 数据绑定系统(Binding) .我也见过几个少数的开发者从Winform开发转成WPF紧紧是因为他的难以自信的数据绑定能力. 数据绑定是以一种自动的方式将数据对象从一个地方移动到另外一个地方.你可以指定何时,何种方式和何种原因触发一个数据绑定使其将数据在目标和源点之间进行传输. 所以将一个UI元素的属性绑定到另外一个UI元素的属性这是可能的.甚至还可以将一个元素绑定到他自己身上. 另外, 数据转化器可以是的两个不同属性间不同类型数据可以绑定在一起.绑定可以在代码间创建也可以在标记性语言中创建.

     在WPF中,用户界面被描述为一种典型标记性语言---XAML.它是应用程序扩展语言的代表.它基于XML格式并且用来声明.Net对象. 并通过属性值和事件句柄来配置这些.Net对象. XAML文件通常背后都有一个C#代码文件.你可以在这个代码文件中处理XAML中声明的方法. 这个XAML文件和这个代码文件都包含了一个或多个部分类. 这就意味着你可以通过代码文件来访问XAML中声明的对象,反之亦然.

      有一些控件, 例如: 按钮, 菜单项 完全允许你绕过代码设置他的命令属性. 如果你设置一个按钮的命令属性为一个已经实现了ICommand接口的对象,那么当用户点击这个按钮它就会自动执行这些命令.正如我们接下来看到的,声明一个绑定到一个命令上将有助于简化你的应用程序设计.

      将各种UI元素安排进多种多样的布局中是用户界面开发中必须做的.在WPF中,利用他所支持的面板,你可以实现无数的各种各样的布局. 一组”Panel”指的是一个知道如何摆放它的子元素的元素容器.它是根据他们的大小和布局逻辑做到这一点的. 一些”Panel”为了实现期望的布局也会调整他们的子元素的大小. WPF包含了几个通用的抽象的Panel类.例如:Grid, StackPanle. 如果你需要使用坐标去表示位置的话, 那Canvas Panel将是最佳选择.

     连最简单的应用程序也应该需要显示某些对象列表,WPF将这些对象列表当作First-Class Citizen(不知道怎么翻译这里)并且给你提供了ItemsControl.许多公用控件都是从ItemsControl派生的.例如: ListBox和ListView. 它们中有个ItemsSource属性可以设置为任何对象集合. ItemsControl派生的UIElements可以渲染这些对象集合. 你可以给ItemsControl指定它的ItemTemplate属性为用户自定义的DataTemplate就可以以你想要的任何方式渲染这些列表控件中的表项. 在更加复杂的情况下, 你可以使用一个ItemTemplateSelector来自动选择一个基于数值和数据对象的DataTemplate. ItemsControl的另外一个特性是允许你指定特定布局面板来安排的的子元素的布局.你可以使用任何布局面板,包括用户面板,作为ItemsPanel来实现你希望的布局策略给这些ItemsControl的子元素布局.

     另一个你需要理解的是WPF如何使得BubbleBurst意义非凡是它用了一个”保留的”渲染系统(it uses a “retained” rendering System). 不像Windows Forms 和其他基于HWND(MFC里面的窗口句柄)UI平台, 在WPF中, 你几乎不需要写代码去绘制窗口. 他反对这种”破坏性”(destructive)的渲染系统. WPF保留的渲染系统缓存向量绘制指令和智能化的处理这些工作对你来说是透明的(WPF’s retained rendering system caches vector drawing instructions and intelligently manages the job of handling things like region invalidations for you). 你只需要提供给WPF你想要绘制界面的描述即可, 通过高级的对象,例如椭圆, TextBlock. 它就会计算出这个对象需要在屏幕的哪里,什么时候画.

有关更多WPF:

如果你在读下去前想要学习更多关于WPF,那考虑下访问以下链接.

Windows Presentation Foundation 介绍

http://msdn.microsoft.com/en-us/library/aa970268.aspx

WPF 架构.

http://msdn.microsoft.com/en-us/library/ms750441.aspx

WPF指导.

http://joshsmithonwpf.wordpress.com/a-guided-tour-of-wpf/

WPF 自定义数据通过DataBinding显示.

http://msdn.microsoft.com/en-us/magazine/cc700358.aspx

ItemControl

http://drwpf.com/blog/2008/03/25/itemscontrol-i-is-for-item-container/

 

MVVM

     经常说条条大路通罗马. 今天, 所有的WPF和Silverlight最佳实践都是通向了Model-View-ViewModel这个设计模式. MVVM已经成为一种共同讨论, 设计和实现WPF和Silverlight程序的方式. 像所有其他设计模式一样, 它有一系列的实践指导让你写出听起来很结构化的可维护的,易理解的软件.像所有其他设计模式一样. 它提供给你一个共同的词汇,你可以和你的技术团队讨论得津津乐道. 它来自Model-View-Presenter设计模式.但是作为一个开发者,你可以简化你的生活通过它这种设计模式(原句: It takes root in the Model-View-Presenter design pattern, but diverges in ways that enable you to leverage capabilities of the ui platform to simplify your life as a developer太难翻译了)

     MVVM声明了3个对象目录, Model对象包含了由用户修改数据. 同样可以包含一些商务处理规则, 输入验证, 更改跟踪, 和其他有关于你的系统的数据的东西. Views, 它是完全可视化的东西. 一个View是由一个显示数据的UI控件, 允许用户通过输入设备(键盘,鼠标)修改程序的状态, 显示影像, 画廊, 或者其它你想要在屏幕上看见的东西. 到目前为止,一切正常. 现在我们来讨论中间层: ViewModel.

ViewModel是一个Model的View.

      这一句不能很清晰的说明这个主题.让我们来点深层次的. 首先. 一个ViewModel不仅仅是一个新建View的代码隐藏(注: 就是那些.xaml.cs). 这个是一个共同的误解. 如果有一个人将ViewModels想成一个新建窗口的隐藏代码文件. 他们可能是写了太多Winform程序了. 当使用ViewModels时, 你的Views很多情况下应该有一个代码隐藏文件. 但是这个ViewModel是一个抽象的用户接口. 他应该和UI元素无关. 那些处理对象选中时候变成另外一种视图的逻辑代码才应该出现在Views的代码隐藏中(Logic that deals specifically with objects scoped to a particular view should exist in that view's code-behind)

     你可能会疑惑”那ViewModels是用来做什么的”.有几个理由需要创建和使用ViewModels.最重要的原因是允许你将程序的用户接口当作逻辑系统以便你设计成一个独立的工程,应用程序的其他部分也可以使用(原文很难理解: The most important reason is that it allows you to treat the user interface of an application as a logical system that can be designed with the same quality of engineering and object orientation that you apply to other parts of your application).它可以使你很容易的给用户接口功能写单元测试, 而不需要为了这些繁杂的UIs而迷茫于单元测试.它意味着这些渲染你的ViewModel的Views当你需要的时候可以被修改或者替换,并且不需要修改任何ViewModel类.这样意味着你可以使用类似于MEF这样的框架动态生成你的ViewModel.也意味着很容易支持插件式架构在你的用户接口布局里面.

       建立MVVM应用程序所涉及到的基本机制是数据绑定和命令.ViewModels对绑定的Views提供了某些属性. 包括返回命令对象.当ViewModel属性更改了之后.绑定了ViewModel的View将会收到修改触发,当ViewModel触发他的PropertyChanged Event(仅有一个函数成员的INotifyPropertyChanged接口). 数据绑定系统会自动从更改的属性那里获得新的数值并在View里面更新绑定属性. 类似地,在Views里面改变数据也会通过绑定传达到ViewModel中. 当用户点击了一个绑定了命令到ViewModel的按钮, 这个命令就会执行并且允许ViewModel处理用户的交互行为. 如果ViewModel需要对View提供一个可修改的对象集合, VM可以使用ObservableCollection<T>这个类就可以很容易得到集合修改的通知.(注: 也就是说你的想为View某个列表控件绑定一个集合的话,那么最好是从ObservableCollection<T>中里面派生出来.因为它带有自动修改通知.当集合修改了.他会通知界面更新.而不需要你做任何动作.)

       使得View和ViewModel粘合在一起的,最常见的是: DataContext属性.它是被所有的visual elements继承的属性.当一个View创造了.他的DataContext可以为ViewModel.这样你的View上面的元素可以很容易绑定到ViewModel中的元素(这句话Very Important).这个一个不难实施而且速度很快的方式.有些人更宁愿将他们的ViewModel放入资源字典中.元素绑定这是通过资源引用. 这种技术和可以和MicroSolf的Expression Blend工具很好地协同工作(注: 不知道说是DataContext 还是资源字典,还是这种View和ViewModel的绑定方式).

学习有关更多的MVVM:

如果你在阅读下去之前愿意学习更多有关MVVM的知识.考虑以下几个链接:

MVVM设计模式下的WPF应用程序.

http://msdn.microsoft.com/en-us/magazine/dd419663.aspx

使用ViewModel设计模式是的WPF TreeView编写更简单.

http://www.codeproject.com/Kb/Wpf/TreeviewWithViewModel.aspx

掌握WPF和Silverlight下的MVVM.

http://weblogs.asp.net/craigshoemaker/archive/2009/02/26/hands-on-model-view-viewmodel-mvvm-for-silverlight-and-wpf.aspx

M-V-VM via Karl Shifflett

http://karlshifflett.wordpress.com/mvvm/

MVVM light Toolkit via Laurent Bugnion

http://www.galasoft.ch/mvvm/

Josh Smith的MVVM 组织 (最权威的MVVM网站了)

http://mvvmfoundation.codeplex.com/

 

装载请注明:

http://www.cnblogs.com/kingmoon/

posted on 2011-07-14 16:29  kingmoon  阅读(2964)  评论(3编辑  收藏  举报

导航