最近开始学习MVVM设计设计模式,关于MVVM的简单介绍可以查看:http://baike.baidu.com/view/3507915.htm
MVVMLight是一个采用MVVM设计模式的比较流行的框架,本文讲解基于MVVMLight框架的Win10项目的搭建
说明一点,不同的程序猿有不同的编程习惯,许多操作因人而异,不一定要完全按照下文的流程使用MVVMLight框架
开始进入主题
1、新建Win10空白项目
2、在解决方案管理器中右键"引用",选择“管理NuGet程序包”。在浏览标签下搜索“MvvmLight”,选择第二个,在右边列表点击安装。(如果在WPF等其他项目中,第一个会在项目中新增一些文件和代码,第二个是纯类库)
3、由于MVVMLight框架目前未对Win10应用做适配,因此不会在项目中创建其他的文件,我们需要手动添加
新增以下文件夹:“ViewModel”、“Model”、“Helper”、“Converters”,“Controls”暂时使用这些文件夹,随着学习的深入再逐渐完善项目结构。每个文件夹的功能如下:
ViewModel:存放不同的ViewModel
Model:存放Model类
Helper:帮助类
Converters:转换类
Controls:自定义控件
4、在ViewModel文件夹下新增ViewModelLocator.cs文件
using GalaSoft.MvvmLight.Ioc;
using Microsoft.Practices.ServiceLocation;
namespace MVVMLightDemo.ViewModel
{
public class ViewModelLocator
{
public ViewModelLocator()
{
ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default);
SimpleIoc.Default.Register<MainViewModel>();
}
public MainViewModel Main => ServiceLocator.Current.GetInstance<MainViewModel>();
public static void Cleanup()
{
}
}
}
在ViewModel文件夹下新增MainViewModel.cs文件
using GalaSoft.MvvmLight;
using MVVMLightDemo.Model;
using System.Collections.ObjectModel;
namespace MVVMLightDemo.ViewModel
{
public class MainViewModel: ViewModelBase
{
public MainViewModel()
{
Persons = SetItems();
}
private ObservableCollection<Person> SetItems()
{
var items = new ObservableCollection<Person>();
for (int i = 0; i < 10; i++)
{
Person p = new Person()
{
Name="Name"+i,
Age=i
};
items.Add(p);
}
return items;
}
private ObservableCollection<Person> _persons;
public ObservableCollection<Person> Persons
{
get
{
return _persons;
}
set
{
_persons = value;
RaisePropertyChanged();
}
}
}
}
其中Person是Model文件夹下的一个基础类:
namespace MVVMLightDemo.Model
{
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
}
}
5、在App.xaml文件中添加Locator的引用:
<Application.Resources>
<loc:ViewModelLocator x:Key="Locator"/>
</Application.Resources>
注意命名空间的使用:
xmlns:loc="using:MVVMLightDemo.ViewModel"
6、修改MainPage.xaml文件
<Page
x:Class="MVVMLightDemo.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:MVVMLightDemo"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
DataContext="{Binding Source={StaticResource Locator}, Path=Main}"
mc:Ignorable="d">
<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
<ListView ItemsSource="{Binding Persons}">
<ListView.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding Name}"/>
<TextBlock Text="{Binding Age}"/>
</StackPanel>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</Grid>
</Page>
以上代码中要注意数据上下文DataContext的使用,Path=Main是因为在ViewModelLocator类中定义了Main。
7、不用的页面对应不同的ViewModel,如新增一个Page2,需要在ViewModel文件夹下新增Page2ViewModel.cs文件,在ViewModelLocator中新增相应的代码
public class ViewModelLocator
{
public ViewModelLocator()
{
ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default);
SimpleIoc.Default.Register<MainViewModel>();
SimpleIoc.Default.Register<Page2ViewModel>();
}
public MainViewModel Main => ServiceLocator.Current.GetInstance<MainViewModel>();
public Page2ViewModel Page2 => ServiceLocator.Current.GetInstance<Page2ViewModel>();
public static void Cleanup()
{
}
}
至此,一个简单的基于MVVMLight框架的Win10项目构建完成