MVVM的最大优势就是在界面的本质没有改变的情况下ViewModel代码是都不需要改动的。
1)确定UI中使用了多好命令属性和数据属性。
先来看看看法完的界面,进行一下分析:
通过UI窗体可以分析出来:
(1)餐馆的名字;餐馆的地址;订餐电话都是有可能更改的所以,这些属性需要Binding到一个ViewModel上去,并且需要一个餐馆的类来作为Model类。
(2)下面的DataGrid里都是菜品的信息,需要一个菜品的Model类。
(3)“共计“和”Order“是需要使用到命令属性Binding的。
数据属性有:餐馆信息;DataGrid里显示的菜品信息;”共计”里显示的数据。
命令属性有:“Order”操作;DataGrid中的“选中“操作。
这里用到了包含对命令属性俩种最典型的使用方法:一种是单独UI元素和命令属性的绑定;第二种是集合元素中每个元素与命令属性的关联关系。
2)MVVM的架构:
接着分析的话,面向对象的开发,数据要组织在对象里,而不是凌乱的乱放。所以这里的餐馆的名字,地址,电话都应该是来自同一个数据源对象。也就是这几个数据应该来源于一个餐馆的对象的属性。菜品信息应该来源于菜品对象。
3)开发源代码架构:
(1)Data文件家里的xml文件是作为项目的DB使用。先新建一个Data文件夹,然后把已经准备的XML文件copy进来,为了让这个data数据能够与程序发布,需要秀爱该文件的属性为:
(2)有了Data后,我们需要一个Service来读取这个Data数据,由于这个是一个模拟数据,所以我们的DataService在后期实际中会发生变化,这个时候就需要使用接口把数据读取的定义和实现进行分开:先新建一个Services文件夹,在这个文件夹中新建一个接口IDataService用来定义读取数据的接口类:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace WPFMVVMDemo.Services
{
public interface IDataService
{
//使用接口把定义和实现分离开 有利于后期更改数据源
//接口定以后,可以用其他的类来实现接口内的方法,来指定实现接口的方法名称。
List<Dish> GetAllDishes();
}
}
(3)那这个时候就可以发现我们的Service和Model是紧密相关的(这里的Dish类),所以就需要新建一个Model文件夹,在该文件夹里新建一个Dish类,而且这个Dish菜品信息类是对应着我们的Data.xml数据的:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace WPFMVVMDemo.Models
{
作为ViewModel的基础类来存在
public class Dish
{
public string Name { set; get; }
public string Category { set; get; }
public string Comment { set; get; }
public double Score { set; get; }
}
}
(4)有了这个Model后,我们就可以继续写Service了,需要实现读取xml文件的类来实现IDataService
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using WPFMVVMDemo.Models;
using System.Xml.Linq;
namespace WPFMVVMDemo.Services
{
//继承IDataService后来实现GetAllDishes方法来获取数据信息
public class XmlDataService:IDataService
{
public List<Dish> GetAllDishes()
{
List<Dish> dishList = new List<Dish>();
string xmlFileName = System.IO.Path.Combine(Environment.CurrentDirectory, @"Data\Data.xml");
XDocument xDoc = XDocument.Load(xmlFileNa