MVVM Light框架点滴(MVVM模式)
[以下基于Silverlights4]
MVVM Light组成
目前的框架就两个库文件
GalaSoft.MvvmLight库
ViewModelBase:View Model的基础类,MVVM中VM实现
Messenger:用于ViewModel和View之间传递的消息,注意系统的GalaSoft.MvvmLight.Messaging命名空间下已经预定义了一些常使用的消息处理类,
如DialogMessage、NotificationMessageAction、NotificationMessageWithCallback等
Command:命令,RelayCommand,用语和界面元素的响应处理绑定
GalaSoft.MvvmLight.Extras库
EventToCommand:使用XAML 绑定Command,Expression4中使用
DispatcherHelper:处理多线程
MVVM Light安装和使用
GalaSoft.MvvmLight.Binaries.V3.zip
解压到系统的Program files目录
GalaSoft.MvvmLight.Templates.V3.VS10.zip
将其中的ItemTemplates ProjectTemplates下的Silverlight内容拷贝到对应的
C:\Users\Administrator\Documents\Visual Studio 2010\Templates下
此时New Project是可以选择Silverlight下的MVVM light模板,不过这个模板也是比较简单的
一般项目使用方法:
1、 添加GalaSoft.MvvmLight.SL4.dll GalaSoft.MvvmLight.Extras.SL4.dll引用
2、 在App.xaml中加入ViewModelLocator, 当然如何使用代码或则MEF实现View和ViewModel之间的绑定,这个也不需要
xmlns:vm="clr-namespace:MvvmLight1.ViewModel"
<vm:ViewModelLocator x:Key="Locator d:IsDataSource="True" />
3、 添加ViewModel、View
此时:
ViewModel中:加入Command实现、发送消息和View 传递信息
View中: 绑定数据、绑定Command、注册消息、ICleanup实现ViewModel清理注册消息清理、界面和交互设计
至于View和ViewModel之间的初始化关联可以使用ViewModelLocator.cs的形式建立和绑定【这个形式还是有些麻烦】,当然也可以使用MEF等IOC实现自动注入
View中绑定ViewModel可以使用
DataContext="{Binding Main, Source={StaticResource Locator}}",也可以使用代码实现绑定[此处的Locator就是在App.xaml声明的]
MVVM Light实例
消息注册 |
一般在View中注册以响应ViewModel中消息,当然也可以在别处注册 Messenger.Default.Register(this, OnReadOnlyIssueMessage);
Messenger.Default.Register<Brush>(this, true, m => BackgroundBrush = m);
|
消息发送 |
Messenger.Default.Send(new CommandMessage(Notifications.NotifyShutdown));
Messenger.Default.Send<Brush, MainViewModel>(savedSettings.ApplicationBackgroundBrush);
|
Command定义 |
public RelayCommand ShutdownCommand
{
get;
private set;
}
public MainViewModel()
{
if (IsInDesignMode)
{
}
else
{
ShutdownCommand = new RelayCommand(ShutdownService.RequestShutdown);
}
}
RemoveFileCommand = new RelayCommand<Data.Web.File>(g => this.OnRemoveFileCommand(g), g => g != null);
|
Command绑定 |
<Button Content="Shut" Command="{Binding Path= ShutdownCommand }" />
…
Command="{Binding Path=RemoveFileCommand}"
CommandParameter="{Binding SelectedItem, ElementName=listBox_Files}"
|
ICLeanup MEF |
public partial class AllIssues : UserControl, ICleanup
{
public AllIssues()
{
InitializeComponent();
if (!ViewModelBase.IsInDesignModeStatic)
{
// Use MEF To load the View Model
CompositionInitializer.SatisfyImports(this);
}
}
[Import(ViewModelTypes.AllIssuesViewModel)]
public object ViewModel
{
set
{
DataContext = value;
}
}
public void Cleanup()
{
// call Cleanup on its ViewModel
((ICleanup)this.DataContext).Cleanup();
// call Cleanup on IssueEditor
this.issueEditor.Cleanup();
// Cleanup itself
Messenger.Default.Unregister(this);
}
|
DispatcherHelper |
源代码中GalaSoft.MvvmLight.Test (SL).csproj
TestDispatcherHelper.cs有详细内容
|
ViewModel |
从ViewModelBase继承实现视图对应的类
|