最近开始学习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(); } } } }
namespace MVVMLightDemo.Model { public class Person { public string Name { get; set; } public int Age { get; set; } } }
<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>
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() { } }