当前位置: 首页 > news >正文

义乌网站公司做网站公司哪家便宜

义乌网站公司,做网站公司哪家便宜,青岛网站建设 大公司,宣传型企业网站设计方案本文转自 陈希章-MVVM、MVVMLight、MVVMLight Toolkit之我见 MVVM、MVVMLight、MVVMLight Toolkit之我见 我想#xff0c;现在已经有不少朋友在项目中使用了MVVMLight了吧#xff0c;如果你正在做WPF#xff0c;Silverlight#xff0c;Windows Phone的开发#xff0c;那么…本文转自 陈希章-MVVM、MVVMLight、MVVMLight Toolkit之我见 MVVM、MVVMLight、MVVMLight Toolkit之我见 我想现在已经有不少朋友在项目中使用了MVVMLight了吧如果你正在做WPFSilverlightWindows Phone的开发那么你有十分必要的理由了解MVVM和MVVMLight。我写这篇文章的目的是给大家做一个总结以便更多的朋友了解并掌握MVVM。   首先要说一下MVVM的概念。MVVM严格来说并不是一种框架而是一个设计的模式吧。与它有关的设计模式还有MVC 现在广泛用于Web应用中以及MVP之前有用过在Windows Forms和WPF中   如果你希望对MVVM有更加感性地认识我推荐你看下面这篇文章。 http://www.codeproject.com/KB/WPF/WpfMvvmQuickStart.aspx 这篇文章写得实在太好了我很欣赏这样的技术人才能把一个抽象问题有层次地讲清楚。我强烈建议对MVVM的概念了解不深的朋友认真读这篇文章而不要急于用MVVMLight因为MVVM是一种模式而MVVMLight只是其中一种具体的实现   然后我要说一下MVVMLight吧刚才说了它是一种MVVM的实现。自然它不是唯一的一种实现但现在大家公认的是它是比较好的一个实现。就我个人的体会来说我以前用过微软提供的Prism中的MVVM特性但老实说可能Prism的目标太大了所以在MVVM这个具体的点上实在不是那么好用。   值得一说的是从使用Prism转换到使用MVVMLight过程相当简单如果有类似情况的朋友不要有什么顾虑。我这里不是说Prism不好它与Mvvmlight严格来说不是一个重量级的产品。MVVMLight专注与MVVM的实现自然更加灵活。   接下来我认为要学习MVVMLight最好的Quick start就是作者自己写的这个网页 http://galasoft.ch/mvvm/ 通过这个文章我们可以很清楚地了解MVVMLight的设计思路和包含的有关组件无需太多补充文章浅显易懂确实是我们要学习的一个榜样 请注意我这篇文章并非逐一讲解MVVMLight的细节功能使用我主要提一些重点并且分享一些我的看法和观点当然这仅是我一家之言不见得完全正确。 事实上针对如何使用的方面已经有不少文章了大家可以参考 http://zzk.cnblogs.com/s?wmvvmlight 另外一方面我觉得大家其实要自己多动手才会有实际的收获。MVVMLight使用并不难在使用中大家可以领会到更多。   实际上我们经常谈论MVVMLight的时候其实谈的是MVVMLight Toolkit它主要是为了更加方便开发人员使用MVVMLight它会在本地的GAC(Global Assembly Cache中分别安装针对WPF,Silverlight,Windows Phone的Assembly分别各自有两个Assembly并且在Visual Studio中添加相应的项目以及项模板更加贴心的一点是它还提供了几个代码段。   有的朋友可能会问那么MVVMLight到底是什么呢呃MVVMLight嘛就是MVVMLight Toolkit的名称啦 有点绕对吧放松点不要那么较真嘛     这里要指出的是我个人并不喜欢用这个Toolkit提供的项目模板和代码段。我觉得它所生成的代码有些冗余修改起来反而麻烦。我真正的项目中就不用这些模板而是倾向于自己编写ViewModel之类的。这可能也跟我之前并不是一开始就使用MVVMLight有关系我更习惯自己写那些代码我指的是一些ViewModel的属性命令和绑定等等。   好吧我承认我为什么不喜欢使用Toolkit的模板呢还有一个原因是除非必要我对于工具要给Visual Studio添加额外的东西哪怕是有用的总是很敏感的我担心它让Visual Studio变慢。是的你知道这多少有点类似“洁癖”的嫌疑但怎么说呢让我保留自己这个权利吧   那么如果你像我一样不安装MVVMLight Toolkit如何使用MVVMLight呢实际上很简单我更加习惯于使用nuget package 来获取最新的MVVMLight的Library并将它们添加到项目中来。 你可以通过这个菜单打开nuget package explorer如下图所示然后你可以在Online里面搜索MVVMLight或者像我这样在Recent package中直接就可以Install。(nuget package是会被缓存在本地的所以即便没有链接到网络也可以正常使用 既然可以缓存在本地那么其实和安装到GAC是没有太大区别的不是吗 而且用这种方式还有一个好处你总是可以得到最新的版本因为nuget package是自动有更新提示的。而如果你是用Toolkit的话则得不到更新的提示。据可靠消息MVVMLight将很快有4.0这个版本   很好你现在已经知道如何将MVVMLight添加到项目中接下来就是该让它发挥威力的时候啦。大家一定要理解MVVM的两个核心目标 1.让UI界面与逻辑能够很好地分离又协同工作。 2.让逻辑代码更具有可测试性。   我们先来说说分离并协同这个目标在MVVMLight中主要通过什么实现的呢它提供了ViewModelBase这个基类可以让我们很方便地编写ViewModel。从下面的截图可以看出它提供了很多有用的特性例如判断是否在设计状态IsInDesignMode)以及触发属性更改通知(RaisePropertyChanged)尤其是后者这可以说是MVVM的根基为什么这么说呢UI与逻辑的分离并且协同工作关键就在于WPF和Silverlight有强大的数据绑定机制而数据绑定机制之所以能够强大就是因为WPF和Silverlight中引入的依赖属性(Dependency Property)的机制而依赖属性区别于普通属性的最重要一点就是既可以有单向绑定也可以有双向绑定而且属性更改之后可以通知到所有绑定目标上面。   除了很好的支持绑定UI与逻辑分离并协作的另外一个重要机制就是命令command)机制。在MVVMLight中它提供了两个基本的命令RelayCommand和RelayCommandT 这两个命令其实没有本质区别只不过后者是支持泛型的一个参数的就是可以从命令源接受参数数据。 需要注意的是这两个命令只适合绑定在基于按钮的Click事件上面。例如Button,HyperlinkButton是最常见的。例如下面的例子 这个绑定的意思其实就是说当这个Button被点击了之后调用ViewModel中的SaveCommand 如果需要传递参数过去呢就是下面这样啦。我举了两个例子第一个例子参数是一个常数而第二个例子参数是一个绑定值这都是允许的 但问题是如果我要绑定其他事件呢例如MouseMove事件该怎么办呢在MvvmLight.Extras这个程序集里面单独又给出了一个Command绑定方式叫EventToCommand顾名思义它可以将任何事件绑定到一个命令 要使用这个略微麻烦一些请看下面的例子 所以绑定尤其是双向绑定和命令是MVVM的精髓但实际要认真讲起来MVVMLight这方面实现得其实也没有什么特别突出的其他一些框架也都是这么做的。以前没有这些框架之前我们也是这么写的无非是代码会多一些而已。 有童鞋可能会说了属性绑定我们可以理解但为嘛要这么麻烦去绑定命令呢直接在xaml.cs里面写不就完了吗请注意MVVM的一个目标就是让xaml.cs代码中尽量少极端的情况是没有任何用户代码。这样才能实现UI与逻辑的分离所以尽可能地用Command来做。 这里我也分享我的个人经验一定会有的时候你没有办法全部用Command而不在xaml.cs中写任何代码。那个时候你也大可像我一样将代码写一些在xaml.cs中也无妨。典型的情况是希望在视图里面接受消息下面就要讲到并且更新界面的一些效果例如启动动画。这里面是一个度的把握并无绝对的好坏。我已经看到有人心领神会地点头了所谓随机应变大家要有一定的灵活性。   不过Mvvmlight的一个创造性的设计是它的Message消息机制它让View和ViewModel以及ViewModel之间通讯变得相当方便甚至神奇。我相当欣赏这个设计这是Mvvmlight之所以称为Mvvmlight的原因。 具体来说它提供了一个Messenger类型可以用来发送和接收消息它还提供了默认的几种消息类型。 A Messenger class (and diverse message types) to be used to communicate within the application. Recipients only receive the message types that they register for. Additionally, a target type can be specified, in which case the message will only be transmitted if the recipients type matches the target parameter. Messages can be anything from simple values to complex objects. You can also use specialized message types, or create your own types deriving from them. More information about the Messenger class.  MessageBase: A simple message class, carrying optional information about the messages sender. GenericMessageT: A simple message with a Content property of type T. NotificationMessage: Used to send a notification (as a string) to a recipient. For example, save your notifications as constant in a Notifications class, and then send Notifications.Save to a recipient. NotificationMessageT: Same as above, but with a generic Content property. Can be used to pass a parameter to the recipient together with the notification. NotificationMessageAction: Sends a notification to a recipient and allows the recipient to call the sender back. NotificationMessageActionT: Sends a notification to a recipient and allows the recipient to call the sender back with a generic parameter. DialogMessage: Used to request that a recipient (typically a View) displays a dialog, and passes the result back to the caller (using a callback). The recipient can choose how to display the dialog, either with a standard MessageBox, with a custom popup, etc… PropertyChangedMessageT: Used to broadcast that a property changed in the sender. Fulfills the same purpose than the PropertyChanged event, but in a less tight way.一个稍微具体一点的例子请参考 我非常喜欢这个Messenger的功能但同时我个人觉得它的设计有值得改进之处首先它的语法有点繁琐了不是吗 我们显然更希望用下面这样的语法 这是如何实现的呢其实我是自己对Messenger做了一个扩展 using System; using System.Collections.Generic; using System.Linq; using System.Text; using GalaSoft.MvvmLight.Messaging;namespace WpfApplication1 {/// summary/// 对默认的Messenger做扩展以便更加易于使用/// 作者陈希章/// /summarypublic static class MessengerExtension{public static void SendT(this IMessenger messenger, T body, object token){Messenger.Default.SendGenericMessageT(new GenericMessageT(body), token);}public static void RegisterT(this Messenger messenger, object recipient, object token, ActionT action){Messenger.Default.RegisterGenericMessageT(recipient, token, msg {action(msg.Content);});}} }关于Messenger其次我还觉得它定义那么多消息类型并不是非常理想容易把使用者搞晕我其实也不是很理解为什么既要做一个GenericMessage还有一个NotificationMessage等等。这也是我用上面这样的方式扩展的原因。我后面会整理一个扩展代码做成可以分享的package给大家使用。   讲了这么多其实还有一个经常被大家忽视的目标可测试性。这是很重要的。如何理解MVVM的可测试性以及在MVVMLight中的具体实现呢 我们来看一个例子我们通常会说这是一个不可测试的代码例子   为什么说它是不可测试的呢?因为我们都知道MessageBox是需要人去响应的你要点击一下才会被关闭掉。而我们的测试包括单元测试大多都是要能批量自动运行的那么遇到这种MessageBox怎么办呢 我们一般单元测试代码会这么样写 运行起来之后它确实会按照预期的那样去执行代码很显然它会弹出一个对话框让我们去点击 点击了之后当然测试会通过。但问题是如果测试还需要人工干预才能运行显然不利于自动化。 我们来看在MVVMLight中如何解决这个问题的。我们得捋一下思路你的目的是要弹出一个对话框或者类似的东西但如果你必须用MessageBox的话就肯定是会弹出那个对话框来。有什么办法可以解决这个问题呢 答案就是MvvmLight提供的Messenger机制。我们来看如下的例子 那么这个消息会被谁来响应呢一般是在View里面去响应仔细想想显示消息以及如何显示其实是View的责任与ViewModel没有什么关系。 很好这样就是MVVM的做法了那么我们再来运行测试看看会怎么样呢大家如果自己运行一下就知道了测试直接通过了没有任何消息提示。 等等这难道就说明我们做对了吗我们的测试中怎么确认消息发出去了呢也就是说既然上面的代码并不会弹出消息你怎么确认那个方法里面发送了消息呢 所以好戏一般都在后头不要着急下结论。所以可测试性是指MvvmLight为此类问题都准备了解决方案。我们如何确认SaveCommand里面肯定调用而且仅仅调用了一次Messenger.Send方法呢 很显然我们得有一个什么方式模拟Messenger的功能我们并不真的去发消息我们是要验证发送消息的方法真的被调用而且发的消息内容是不是“保存成功”这就是我们测试的目的。 在这里我们会用到一个模拟的框架我最喜欢用的是Moq这个框架。这也是一个开源项目它的官方网站是 http://code.google.com/p/moq/ 同样我们可以通过nuget package explorer中获取它实在是很方便不是吗   然后我们编写下面的测试代码 using WpfApplication1; using Microsoft.VisualStudio.TestTools.UnitTesting; using System; using System.Windows.Input;using Moq; using GalaSoft.MvvmLight.Messaging;namespace TestProject1 {/// summary///This is a test class for MainWindowViewModelTest and is intended///to contain all MainWindowViewModelTest Unit Tests////summary[TestClass()]public class MainWindowViewModelTest{/// summary///A test for SaveCommand////summary[TestMethod()]public void SaveCommandTest(){MainWindowViewModel target new MainWindowViewModel(); // TODO: Initialize to an appropriate value var messenger new MockMessenger();messenger.Setup(m m.Send(It.IsDialogMessage(d d.Content 保存成功))).Verifiable();Messenger.OverrideDefault(messenger.Object);var cmd target.SaveCommand;cmd.Execute(null);messenger.Verify();}} }上面的代码很好理解我们希望验证Messenger的Send方法是否被调用而且发送的消息是不是一个DialogMessage内容是不是“保存成功”。moq的特点就是语义很通俗易懂让我们为它鼓掌。 再次运行测试的话我们会发现这次也还是正常通过了测试。但如果我们将ViewModel方法里面的那句发送消息的代码注释掉则就会报告一个错误 我们甚至还可以验证Send方法调用了多少次诸如此类这是moq的功能这里就不多展开了。     写在最后的话 感谢Laurent Bugnion 的杰出工作他是微软MVP我也看过他的视频讲解MVVMLight及其原理和使用的蛮平易近人的典型的程序员和技术发烧友吧。有一个视频上面他穿的一间黑色T恤上面就写着几个字geek, 极客你懂的 Laurent还将源代码发布到了Codeplex你可以通过下面这里下载到 http://mvvmlight.codeplex.com/ 转载于:https://www.cnblogs.com/LCHL/archive/2013/05/07/3065933.html
http://www.yutouwan.com/news/137976/

相关文章:

  • 个人免费网站开发sem优化师底薪一般多少
  • 找个人给我做电影网站seo每天一贴
  • 东莞营销网站建火龙果写作网站
  • 门户网站制作流程博客现在asp做网站
  • 网上做兼职的网站有哪些工作网站备案许可证号查询网站
  • 素材网站可以做淘宝吗网站建设需要考虑的问题
  • 学敏网站建设国际网站建设与维护
  • 怎样在华为云服务器里建设网站沃尔玛超市
  • 网站实名认证功能怎么做做毕业设计的网站设计
  • wordpress 首页描述上海建站 seo
  • 天津非常好的网站建设浙江省网站集约化建设通知
  • 网站后台文章编辑不了最近中国新闻事件
  • 舟山建设银行网站Xammp安装Wordpress
  • wordpress 无法下载主题淄博seo费用
  • 大型网站开发软件网站续费话术
  • 一手楼房可以做哪个网站2022年5月国内重大新闻
  • wordpress 4.0 中文版怀化 优化营商环境
  • 关闭网站后弹窗代码优设网的吉祥物
  • vs2015 asp网站开发中文资源在线官网
  • 西红门网站建设公司营销类网站如何优化
  • iis 设置网站权限公司网站设计思路
  • 网站代码大全荣耀手机官网旗舰店
  • 六站合一的优势备案修改网站名称
  • 我想做卖鱼苗网站怎样做it公司网站模板
  • 网站前后端用什么软件做温州哪里有网站
  • 教育类网站如何做万网域名查询注册商
  • 农业营销型网站源码创作图片的软件
  • 设计师如何注册个人网站科技魏
  • 江苏省建设厅网站建造师强制注销服务器网站建设教程视频
  • 曲阳网站建设推广网站设计主要内容