仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 659|回复: 7
打印 上一主题 下一主题

[学习教程] 来一篇关于NET的MVVM教程(二):入手下手MVVM示例

[复制链接]
分手快乐 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-16 14:21:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
前天傍晚我发表了《Java的跨平台就是一句谎言。》,原本就是周末闲来无事,发表一篇略带争议性的博文让大家都来吵吵架,发表自己的看法,根本就没想着谁把谁打倒,一个行业或者是技术阵营是无法用短期口水仗打到对手的。在上一章中,我们只是开了个头罢了,但是在这一章中,我们将看到一点实践的代码了。我构思了好久,如何让老手能疾速把握我想要转达的常识,然后我得出一个结论:必定必定要复杂化,而且要有看的见摸的着的代码实例。好吧,我们入手下手。

翻开你的VS2010,新建一个WPF项目,定名为MvvmTutorial便可。紧接着,在以后Solution增加4个文件夹,分离为:Infrastructure,Views,ViewModels,Models。然后,把App.xaml改成以下:
<Applicationx:Class="MvvmTutorial.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
</Application>

把MainWindow.xaml,MainWindow.xaml.cs删失落。在Views下增加一个新的WPFWindow,定名为ShellView。在App.xaml.cs中到场:
protectedoverridevoidOnStartup(StartupEventArgse)
{
base.OnStartup(e);
varshell=newShellView();
shell.Show();
}

都完成了吗?如今按F5,你应当能够看到你的程序一般运转,而且已能够看到主窗体了。至此,我们只是做了一些筹办事情。Shell实在就是壳的意义,每个Windows程序城市有一个主窗体,也就是一个壳,我们在这个壳下面拼集各类View来组成一个丰厚的使用程序。

如今我们来看一下详细我们要做些甚么。我说过,只管复杂化,以是我们这章的义务很复杂:就是把一些接洽人显现在主窗体里。我们的接洽人很复杂,只要两个属性:名字和德律风号码。我团体喜好从ViewModel这一层动身,可是很多伴侣仍是习气从Model层写起,那末我们就先来研讨一下Model,即实体。在第一章中有人问是不是应当在Model里完成INotifyPropertyChanged接口,我团体以为这个没有出格的逝世的做法。有点人乐意把Model只管复杂化,也就是说只是一个数据的载体罢了,而把一切与View打交道的事变全体推给ViewModel。但是关于我们这个复杂的例子,我选择让Model也完成INotifyPropertyChanged接口,云云一来,当我们对Model做出修正后,View上就能够显现出变更了(不外在明天这一章里,我们临时不会商ViewModel/Model的修正)。如今,在Models下增加一个Contact类。

我们的Model,很复杂,详细是这个模样的:
usingMvvmTutorial.Infrastructure;

namespaceMvvmTutorial.Models
{
///<summary>
///OurContactmodel,whichstoresdataretrievedfromdatapersistencelayer
///</summary>
publicclassContact:ObservableObject
{
#regionFields

string_name;
string_phoneNumber;

#endregion//Fields

#regionProperties

publicstringName
{
get
{
return_name;
}
set
{
if(_name!=value)
{
_name=value;
RaisePropertyChanged(()=>Name);
}
}
}

publicstringPhoneNumber
{
get
{
return_phoneNumber;
}
set
{
if(_phoneNumber!=value)
{
_phoneNumber=value;
RaisePropertyChanged(()=>PhoneNumber);
}
}
}

#endregion//Properties
}
}

你们大概注重到了这个Contact实践上承继了ObservableObject。这是一个笼统的基类,因为我们未来会有良多类都要完成INotifyPropertyChanged接口,以是我在这里写了一个基类。在Infrastructure下增加一个ObservableObject:

usingSystem;
usingSystem.ComponentModel;
usingSystem.Linq.Expressions;

namespaceMvvmTutorial.Infrastructure
{
publicclassObservableObject:INotifyPropertyChanged
{
publiceventPropertyChangedEventHandlerPropertyChanged;

publicvirtualvoidRaisePropertyChanged(stringpropertyName)
{
if(PropertyChanged!=null)
{
PropertyChanged(this,newPropertyChangedEventArgs(propertyName));
}
}

publicvoidRaisePropertyChanged<T>(Expression<Func<T>>propertyExpression)
{
varpropertyName=PropertySupport.ExtractPropertyName(propertyExpression);
this.RaisePropertyChanged(propertyName);
}
}
}

好的,这里我要说一下,实在这个类不是我团体写的,而是“抄袭”了一些现有的开源代码,拼集起来的。请注重PropertySupport,这是一个静态类,它实在来自于微软的Prism框架里一小段代码,我之以是如许做只是让人人看的更分明这些MVVM的框架外部大致是怎样回事,实在都是迥然不同的。请在Infrastructure下增加PropertySupport:
usingSystem;
usingSystem.Linq.Expressions;
usingSystem.Reflection;

namespaceMvvmTutorial.Infrastructure
{
publicstaticclassPropertySupport
{
publicstaticstringExtractPropertyName<T>(Expression<Func<T>>propertyExpression)
{
if(propertyExpression==null)
{
thrownewArgumentNullException("propertyExpression");
}

varmemberExpression=propertyExpression.BodyasMemberExpression;
if(memberExpression==null)
{
thrownewArgumentException("Theexpressionisnotamemberaccessexpression.","propertyExpression");
}

varproperty=memberExpression.MemberasPropertyInfo;
if(property==null)
{
thrownewArgumentException("Thememberaccessexpressiondoesnotaccessaproperty.","propertyExpression");
}

vargetMethod=property.GetGetMethod(true);
if(getMethod.IsStatic)
{
thrownewArgumentException("Thereferencedpropertyisastaticproperty.","propertyExpression");
}

returnmemberExpression.Member.Name;
}
}
}

有的人大概会问“PropertySupport”究竟是干吗的?实在我们常常写如许的代码:RaisePropertyChanged("SomeProperty"),这个代码自己没有任何成绩,可是我们传进的是一个string,这也就表示了两个小成绩:1.当你的Property更名字今后,你必要修正这个string;2.输出string是个略微简单堕落的历程(打字毛病)。那末PropertySupport.ExtractPropertyName便在就义了一点点效力的条件下,经由过程指定一个Expression来取得其属性的名字。以是我们就能够写成:RaisePropertyChanged(()=>PhoneNumber);云云一来,你只必要指定哪一个属性便可,至于它的名字,不必要你费心,并且当下次你修正PhoneNumber为PrivatePhoneNumber后,你也不必要修正任何string。

Okay,既然我们说了要显现出一系列接洽人,我们便必要一个View和ViewModel。在ViewModels下增加ContactMasterViewModel:
usingSystem.Collections.Generic;
usingSystem.Collections.ObjectModel;
usingMvvmTutorial.Infrastructure;
usingMvvmTutorial.Models;

namespaceMvvmTutorial.ViewModels
{
publicclassContactMasterViewModel:ObservableObject
{
#regionFields

privatebool_isLoaded;
privateObservableCollection<Contact>_items=newObservableCollection<Contact>();

#endregion//Fields

#regionProperties

publicIEnumerable<Contact>Items
{
get
{
//Ifweloadthisviewmodelindesignmode(forexample,inVSorExpression),
//weaddsomerandomdatasothatwecanpreviewthelayoutofourview
if(DesignHelper.IsInDesignMode)
{
for(inti=0;i<25;++i)
{
_items.Add(newContact().GenerateRandomData());
}
}
elseif(!_isLoaded)
{
Load();
}
return_items;
}
}

#endregion//Properties

#regionPrivateMethods

privatevoidLoad()
{
//TODO:Oncewefinishtheimplementationofdatapersistencelayer,
//weneedtore-writethiscodetomakethismethodworkforreal-worldapp.

//Wehaventimplementeddatapersistence
//Therefore,wetemporarilyloadsomerandomdatainmemory
for(inti=0;i<25;++i)
{
_items.Add(newContact().GenerateRandomData());
}
_isLoaded=true;
}

#endregion//PrivateMethods
}
}

注重这内里的DesignHelper:在Infrastructure下增加DesignHelper类:竟发现没有太大的帮助。总觉得要用起来,感觉到不了位。因为公司机器的原因,一直没有安装vs.net(也从来没有用过)。以前做asp的时候一直用DW(感觉其代码联想功能不错),可现在到了asp.net却不习惯了。
爱飞 该用户已被删除
沙发
发表于 2015-1-18 13:28:07 来自手机 | 只看该作者
ASP.net的速度是ASP不能比拟的。ASP.net是编译语言,所以,当第一次加载的时候,它会把所有的程序进行编译(其中包括worker进程,还有对语法进行编译,形成一个程序集),当程序编译后,执行速度几乎为0。
金色的骷髅 该用户已被删除
板凳
发表于 2015-1-26 21:45:29 | 只看该作者
现在主流的网站开发语言无外乎asp、php、asp.net、jsp等。
透明 该用户已被删除
地板
发表于 2015-2-10 21:59:37 | 只看该作者
是目前ASP在UNIX/Linux上的应用可以说几乎为0)。所以平台的局限性和ASP自身的安全性限制了ASP的广泛应用。
乐观 该用户已被删除
5#
发表于 2015-3-1 16:51:09 | 只看该作者
比如封装性、继承性、多态性等等,这就解决了刚才谈到的ASP的那些弱点。封装性使得代码逻辑清晰,易于管理,并且应用到ASP.Net上就可以使业务逻辑和Html页面分离,这样无论页面原型如何改变。
谁可相欹 该用户已被删除
6#
发表于 2015-3-10 21:21:07 | 只看该作者
Servlet的形式和前面讲的CGI差不多,它是HTML代码和后台程序分开的。它们的启动原理也差不多,都是服务器接到客户端的请求后,进行应答。不同的是,CGI对每个客户请求都打开一个进程(Process)。
7#
发表于 2015-3-17 11:09:48 | 只看该作者
ASP.net1.1和2.0在程序上的语法也有很大不同,现在2.0属于新出来的,不知道半年后会不会有3.0(说笑一下)。Windows2003系统自动支持ASP和ASP.net环境,不用安装任何程序。Asp.net属于编译语言。ASP的最大不同(ASP属于解释语言)。
再现理想 该用户已被删除
8#
发表于 2015-3-24 09:04:41 | 只看该作者
但是java靠开源打出的一片天地,特别是在微软的垄断下能打开今天的局面还是有它的生命力的。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-12-23 05:18

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表