MVVM之旅

  MVVM的概念已经在脑子里渗透了一段时间,也试着使用了一段时间,就我个人理解,MVVM所倡导的应该是解耦UI跟数据打交道的那一部分,而纯UI的还是写在CodeBehind里。MVVM是以绑定(绑定数据、绑定命令)来驱动的,脱离了绑定的UI元素就没必要使用MVVM。假设一个窗口里的button作用是关掉这个窗体,如果这样一个动作都要绑到命令里去,简直就是自找麻烦。

  开始MVVM之旅的第一站是实现INotifyPropertyChanged的接口的问题,虽然可以使用Prism或者MVVMLight,但是这个原理还是要懂一点的。在M里实现INotifyPropertyChanged还是在VM里实现,to be or not to be,纠结了很久。

  VM其实就是V的建模,是model for view的意思,所有创建VM的时候是根据V来创建的,为V准备绑定的数据,提供暴露的属性,绑定的命令等。那么问题就来了,要使数据有通知UI的能力,就必须实现INotifyPropertyChanged,如果在M里实现,写M的人就有意见了:我的M只管我自己的逻辑,不管你UI的东东。并且,在M里实现它,如果VM里没有相应的代理属性来获取,UI就得直接绑到“属性的属性”,看起来V已经直接联系到M了。好吧,那么就在VM里实现它,这样看起来似乎清爽了,需要的话就搞M的代理属性,在代理属性里通知UI,UI直接来绑VM,这似乎更合理一点。

  第二站,VM该面向什么。我上面说了一种,所有的VM都是根据V来创建,也有人说VM的创建应该面向业务,可以降低复杂性,增大复用性,因为面向M必定增加复杂性,面向V肯定降低复用性,而面向业务就能取中间的效果。目前我还是面向V,首先是因为这样简单,其次是,面向业务是可以降低复杂,增加复用,可是也是有代价的,你必须了解对项目、需求、甚至设计都十分了解,这样才能抽象出复用性很强的业务,在我没达到那个水平之前,还是老实一点。再者,没使用MVVM之前,我也没见到哪个V的CodeBehind要去用别人的CodeBehind,在我看来,VM只是把V的CodeBehind剥离出来了而已。当然,有些VM是显而易见可以复用的,那就没必要再建多建VM了,心里上感觉,内存是是有限的,能省就省吧。

  第三站,数据的更新时机。一般binding使用了twoway模式,就会及时更新了,UI有什么动作,数据也跟着变,可是有时候也有这样的需求,UI需要显示地更新数据,而不是自动更新。比如我有一个窗体,上面一个文本框绑定了一个数据,和一个按钮用来关闭窗体。当我改变了文本框的内容的时候,我希望我点了关闭按钮的时候才去更新文本框绑定的数据,而不是文本框改变直接立即更新,有一种方案是UpdateSourceTrigger=Explicit,然后在后台里得到BindingExpression,再执行UpdateSource(),这样就能显示更新数据了,这样也有个小问题,UpdateSource方法是要通过控件的BindingExpression去执行的,那就得首先找到这个控件,这是很令人抓狂的,如果一个gridview里有一列是1000个checkbox,我得找到这1000个checkbox,然后再去更新,直接调用gridview的UpdateSource是不会更新里里面的控件的,不知道微软是没注意到,还是里面另有玄机我没参透 。

转载于:https://www.cnblogs.com/zoexia/archive/2013/06/03/3114983.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/421749.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

变量原理深入讲解

javascript是一种解释执行的语言 语言分解释执行和编译执行 人用直观的编程语言来写程序-------------计算机语言010011100 举例理解: 英文 中国人张三(不会英文) 1、把英文报刊翻译成中文报刊,然后再看(翻译完后,多了一份中…

(JAVA)IO1

IO流四个抽象及类 1.字节输出流,写入任意文件OutputStreamwrite 字节数组 字节数组的一部分 单个字节close 释放资源flush 刷新资源,强制刷新资源 2.字节输入流,读取任意文件InputStreamread 字节数组 字节数组的一部分 单个字节close 关闭资…

putil:一个用于获得处理器和系统相关信息的模块

psutil能干的事是:提供了个接口,可以用来获取信息,包括: 当前运行的进程系统(资源使用)信息CPU内存磁盘网络用户psutil实现了很多功能,包括了如下工具所具有的: pstopdfkillfreelsof…

(JAVA)IO缓冲区

package IODemo;import java.io.*; import java.nio.charset.StandardCharsets;/*** author Alina* date 2021年10月18日 9:57 下午* 一、 1.IO流关于缓冲区,* 2.输出流缓冲区:BufferedOutputStream(OutputStream out)* 3.输入流缓冲区&#…

php正则表达式如何找到匹配模式中的最后一组

转载于:https://www.cnblogs.com/MyFlora/archive/2013/06/07/3124073.html

(JAVA)IO流之读写单个字节和复制文本文件

package IODemo;import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException;/*** author Alina* date 2021年10月15日 8:19 下午* read()方法特点* 1.每次只读取一个文件* 2.只运行一次&#xff0c…

sql where in 排序问题

直接上代码了 对于int类型的需要转化一下 select * from cvProducts where ID in(972,687,678,962) order by charindex(cast(ID as varchar),972,687,678,962) 对于varchar的直接使用 select * from cvProducts where MouldNo in(C62859,C63417,C32283) order by charindex(…

(JAVA)FileWriter

package IODemo;import java.io.BufferedWriter; import java.io.FileWriter;/*** author Alina* date 2021年10月31日 10:48 下午* FileWrite 写入文本文件的便捷类,方便快捷* 默认查询编码表,不能指定编码表* BufferedWriter 字符输出流的缓冲对象**/ …

JavaWeb中验证码的实现

在Web程序中,验证码是经常使用的技术之一。Web程序永远面临未知用户和未知程序的探测。为了防止恶意脚本的执行,验证码技术无疑是首选方案之一。本文将讨论如何在JSP和Servlet中使用验证码技术。 验证码的产生思路很简单,在Servlet中随机产生…

IO流复制图片

package IODemo;/*** author Alina* date 2021年11月14日 4:32 下午* 复制文件到指定目录**/ import java.io.*; public class IOcopyfile {public static void main(String[] args) {CopyDir(new File(“源文件”),new File(“目标文件”));}public static void CopyDir(File …

苏教版国标本小学语文第一册汉字笔画

苏教版国标本小学语文第一册汉字笔画 转载于:https://www.cnblogs.com/shangdawei/archive/2013/06/09/3129240.html

IO流与对象结合

package IODemo;import java.io.*; import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.Iterator;/*** author Alina* date 2021年11月08日 9:13 下午* 把Arraylist 里存储的内容存储到本地文件* 1.遍历集合。遍历一次存储一次*/ public…

正则表达式引擎的构建——基于编译原理DFA(龙书第三章)——1 概述

说明:本系列文章介绍的算法均来自编译原理(龙书)一书,如果读者对代码没有兴趣,只想了解算法思路,完全可以阅读龙书相关章节内容,比我讲得清晰透彻。 序: 啃编译原理半年以来&#xf…