MVVM即Model-View-ViewModel,MVVM模式与MVP(Model-View-Presenter)模式相似,主要目的是分离视图(View)和模型(Model),具有低耦合、可重用性、独立开发、可测试性等优点。
MVVM框架有很多,开源的主要有:
PRISM:由微软提供,和MEF/Unity一起用于依赖注入,支持组合命令,可以扩展。MSDN上有详细的教程和演练。
MVVM Light Toolkit:有visual Studio和Expression Blend的项目和项的模板。更多信息请看这里,另外可以参考VS和Expression Blend的使用教程。
Caliburn Micro:支持视图模型先行(ViewModel-First)和视图先行(View-First)两种开发方式,通过co-routine支持异步编程。
Simple MVVM Toolkit:提供VS项目和项的模板,依赖注入,支持深拷贝以及模型和视图模型之间的属性关联。
Catel:包含项目和项的模板,用户控件和企业类库。支持动态视图模型注入,视图模型的延迟加载和验证。还支持WP7专用的视图模型服务。
闭源框架主要有:
Intersoft ClientUI:付费的,只支持WPF和Silverlight,但是,除了MVVM框架,它还提供其它一些特性。
Vidyano:免费但不开源。带有实体映射/虚拟持久化对象(数据容器),业务规则以及内置基于ACL的安全特性。
今天我使用的是微软提供的Prism4.1搭建的小测试。
首先建了个WPF项目,项目目录结构如图
Models 存放的是数据模型
Service存放的是业务逻辑
ViewModels存放的便是视图模型
Views存放WPF窗口
在Models文件夹中创建一个用户模型User.cs
usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;usingSystem.Threading.Tasks;namespaceTest.Wpf.Mvvm.Models
{classUser
{///
///用户名///
public string Nameword { get; set; }///
///密码///
public string Password { get; set; }
}
}
在Services文件夹中添加用户的业务逻辑UserService.cs,因为自己写这个程序重点是学习MVVM,所以这里就简单写了一下
usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;usingSystem.Threading.Tasks;namespaceTest.Wpf.Mvvm.Services
{classUserService
{///
///获取所有用户方法///
///
public ListGetAllUser()
{
List users = new List();for (int i = 0; i < 3; i++)
{
Models.User user= newModels.User();
user.Nameword= "用户" +i;
user.Password= "密码" +i;
users.Add(user);
}returnusers;
}
}
}
在ViewModels中创建主窗口的视图模型MainWindowViewModel.cs,这个地方要添加引用Microsoft.Practices.Prism.dll,我把它放在libs中了
//***************************************************//
//文件名(FileName) : MainWindowViewModel.cs//
//作者(Author) : zsm//
//创建时间(CreateAt): 2013-09-03 16:17:29//
//描述(Description) : 主窗口ViewModel//
//***************************************************
usingMicrosoft.Practices.Prism.Commands;usingMicrosoft.Practices.Prism.ViewModel;usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;usingSystem.Threading.Tasks;namespaceTest.Wpf.Mvvm.ViewModels
{classMainWindowViewModel : NotificationObject
{///
///用户List///
private Listusers;public ListUsers
{get { returnusers; }set{
users=value;
RaisePropertyChanged("Users");
}
}///
///程序名///
public string AppName { get; set; }///
///电话///
private stringphone;public stringPhone
{get { returnphone; }set{
phone=value;
RaisePropertyChanged("Phone");
}
}///
///获取所有用户命令///
public DelegateCommand GetAllUsersCommand { get; set; }///
///构造初始化///
publicMainWindowViewModel()
{
AppName= "WPF MVVM 模式测试";
Phone= "123456";
GetAllUsersCommand= new DelegateCommand(newAction(GetAllUsersCommandExecute));
}///
///获取所有用户命令执行方法///
private voidGetAllUsersCommandExecute()
{
Phone= Phone.Equals("123456") ? "1234567" : "123456";
Services.UserService userService= newServices.UserService();
Users=userService.GetAllUser();
}
}
}
MainWindow.xaml页面的设计是
然后在MainWindow的交互代码中绑定ViewModel
usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;usingSystem.Threading.Tasks;usingSystem.Windows;usingSystem.Windows.Controls;usingSystem.Windows.Data;usingSystem.Windows.Documents;usingSystem.Windows.Input;usingSystem.Windows.Media;usingSystem.Windows.Media.Imaging;usingSystem.Windows.Navigation;usingSystem.Windows.Shapes;namespaceTest.Wpf.Mvvm
{///
///MainWindow.xaml 的交互逻辑///
public partial classMainWindow : Window
{publicMainWindow()
{
InitializeComponent();this.DataContext = newViewModels.MainWindowViewModel();//绑定ViewModel
}
}
}
运行一下就可以了