苏童 发表于 2015-5-10 13:27:26

MVVM模式在Windows Phone 7上的简单实现

做WPF/Silverlight/Windows Phone 7 这种Markup+Code类型的项目,程序员和Blend的Designer配合起来有时候真是一个“抓狂”,最近研究了MVVM模式后深切体会到这个模式的优越性,我研究不不是很深,希望走过路过的高手多多指教!

先贴个图:





按照MVVM模式的思想编写的程序应该在思想上抛弃Xaml文件的code behind(即xaml.cs)文件,这样才能让coder和designer各尽其能。coder需要做的就是在designer设计好的xaml文件里对UI控件的值进行Binding,这里应该会用到Command和Behavior。

在我要做到例子里,我需要对UI的Event监听,实现方法将event绑定到Command(这里需要用到一个MVVM Light Toolkit框架, GalaSoft.MvvmLight, 此下载的文件中包括WPF/Silverlight/WP7的dll版本),而不是用原来的注册event事件(当然这也是MVVM的思想)。关于MVVM Light Toolkit,可以看这篇文章。

接下来我开始展示一个小Demo:

1. 首先看一下我的项目目录及引用的程序集:



2. view里的ContractsItem, 这个view是展示每个联系人的控件,这个控件很简单,只是简单的绑定了姓名和电话



View Code



1   
14   
15         
16   
17   
18   
19         
20            
21               
25            
26         
27         
28         
29            
30            
31         
32   
33


3. view里的ContractsList.xaml,这个view负责显示所有的联系人列表,列表的数据加载方式有两种,一种是用command绑定viewmodel的command,另一种是让viewmodel实现IEnumerable接口,这两种方法我都例子里都会有所显示





View Code



1
17
18   
19                  
20            
21               
22                                 
23               
24            
25            
26            
27         
28         
30         
35            
36               
37                     
38               
39            
40            
41            
42               
43                     
44               
45            
46         
47   
48




4. ViewModel: ContactsListViewModel.cs 类中定义了Command及IEnumerable的方法



View Code



1 using System;
2using System.Net;
3using System.Windows;
4using System.Windows.Controls;
5using System.Windows.Documents;
6using System.Windows.Ink;
7using System.Windows.Input;
8using System.Windows.Media;
9using System.Windows.Media.Animation;
10using System.Windows.Shapes;
11 using System.Collections.Generic;
12 using TwitterPlatform.Model;
13 using System.Collections.ObjectModel;
14 using System.ComponentModel;
15 using TwitterPlatform.Commands;
16
17 namespace TwitterPlatform.ViewModel
18 {
19   public class ContactsListViewModel : IEnumerable
20   {
21
22         public ContactsListViewModel()
23         {
24             this.LoadedCommand = new ShowMessageCommand();
25         }
26
27         public ShowMessageCommand LoadedCommand { get; private set; }
28
29         //GetEnumerator() 加载数据
30         public IEnumerator GetEnumerator()
31         {
32             var l = new List(){
33                         new Person() { Name="Michael", Tel="1234567890" },
34                         new Person() { Name="dali", Tel="1234567890" },
35                         new Person() { Name="houjun", Tel="1234567890" },
36                         new Person() { Name="tony", Tel="1234567890" },
37                         new Person() { Name="jing", Tel="1234567890" },
38                         new Person() { Name="Joel", Tel="98564875" }
39                     };
40             l.Sort();
41             return l.GetEnumerator();
42         }
43
44         System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
45         {
46             return this.GetEnumerator();
47         }
48   }
49 }






5. Person类里只定义了Name和Tel两个属性~~

6. 最后是负责显示list的MainPage 了,在这个page里我用了个Paronama,小戏一下呵呵



View Code



1
5         
6            
7               
8                     
9               
10               
11                     
12               
13               
14
15               
16               
17
18               
19            
20
21         
22   
23




以上就是这个小小的Demo,简单的实现了MVVM模式,在这个Demo里主要实现了Event To Command,也是MVVM模式经常用到的东西。

如果有时间我会再做一个更加详细的大一点点demo,呵呵

欢迎讨论~~



源码下载
页: [1]
查看完整版本: MVVM模式在Windows Phone 7上的简单实现