Prism框架实战——订餐软件

参考B站刘铁猛老师的订餐软件https://www.bilibili.com/video/av29782724?from=search&seid=6787438911056306128

环境:VS2019+Prism框架,参考本人博客安装即可 https://www.cnblogs.com/xixixing/p/11312474.html

程序下载地址 https://files.cnblogs.com/files/xixixing/Demo0813.zip

1、界面分析

2、创建项目Demo0813

 

 具体代码:UI界面MainWindow.xaml

<Window x:Class="Demo0813.Views.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:prism="http://prismlibrary.com/"
        prism:ViewModelLocator.AutoWireViewModel="True"
        Title="{Binding Restaurant.Name, StringFormat=\{0\}-在线订餐}" Height="600" Width="1000"
        WindowStartupLocation="CenterScreen">
    <Border BorderBrush="Orange" BorderThickness="3" CornerRadius="6" Background="Yellow">
        <Grid x:Name="Root" Margin="4">
            <Grid.RowDefinitions>
                <RowDefinition Height="Auto" />
                <RowDefinition Height="*" />
                <RowDefinition Height="Auto" />
            </Grid.RowDefinitions>
            <Border BorderBrush="Orange" BorderThickness="1" CornerRadius="6" Padding="4">
                <StackPanel>
                    <StackPanel Orientation="Horizontal">
                        <StackPanel.Effect>
                            <DropShadowEffect Color="LightGray" />
                        </StackPanel.Effect>
                        <TextBlock Text="欢迎光临-" FontSize="60" FontFamily="LiShu" />
                        <TextBlock Text="{Binding Restaurant.Name}" FontSize="60" FontFamily="LiShu" />
                    </StackPanel>
                    <StackPanel Orientation="Horizontal">
                        <TextBlock Text="小店地址:" FontSize="24" FontFamily="LiShu" />
                        <TextBlock Text="{Binding Restaurant.Address}" FontSize="24" FontFamily="LiShu" />
                    </StackPanel>
                    <StackPanel Orientation="Horizontal">
                        <TextBlock Text="订餐电话:" FontSize="24" FontFamily="LiShu" />
                        <TextBlock Text="{Binding Restaurant.PhoneNumber}" FontSize="24" FontFamily="LiShu" />
                    </StackPanel>
                </StackPanel>
            </Border>
            <DataGrid AutoGenerateColumns="False" GridLinesVisibility="None" CanUserDeleteRows="False"
                    CanUserAddRows="False" Margin="0,4" Grid.Row="1" FontSize="16" ItemsSource="{Binding DishMenu}">
                <DataGrid.Columns>
                    <DataGridTextColumn Header="菜品" Binding="{Binding Dish.Name}" Width="120" />
                    <DataGridTextColumn Header="种类" Binding="{Binding Dish.Category}" Width="120" />
                    <DataGridTextColumn Header="点评" Binding="{Binding Dish.Comment}" Width="120" />
                    <DataGridTextColumn Header="推荐分数" Binding="{Binding Dish.Score}" Width="120" />
                    <DataGridTemplateColumn Header="选中" SortMemberPath="IsSelected" Width="120">
                        <DataGridTemplateColumn.CellTemplate>
                            <DataTemplate>
                                <CheckBox IsChecked="{Binding Path=IsSelected,  UpdateSourceTrigger=PropertyChanged}"
                                        VerticalAlignment="Center" HorizontalAlignment="Center"
                                        Command="{Binding Path=DataContext.SelectMenuItemCommand, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type DataGrid}}}" />
                            </DataTemplate>
                        </DataGridTemplateColumn.CellTemplate>
                    </DataGridTemplateColumn>
                </DataGrid.Columns>
            </DataGrid>
            <StackPanel Orientation="Horizontal" HorizontalAlignment="Right" Grid.Row="2">
                <TextBlock Text="共计" VerticalAlignment="Center" />
                <TextBox IsReadOnly="True" TextAlignment="Center" Width="120" Text="{Binding Count}" Margin="4,0" />
                <Button Content="Order" Height="24" Width="120" Command="{Binding PlaceOrderCommand}" />
            </StackPanel>
        </Grid>
    </Border>
</Window>

MainWindowViewModel.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows;
using Demo0813.Models;
using Demo0813.Services;
using Prism.Commands;
using Prism.Mvvm;

namespace Demo0813.ViewModels
{
    public class MainWindowViewModel : BindableBase
    {
        #region 数据属性
        private Restaurant restaurant; //私有变量、对应的数据属性1
        public Restaurant Restaurant
        {
            get { return restaurant; }
            set
            {
                restaurant = value;
                this.RaisePropertyChanged("Restaurent");
            }
        }
        private List<DishMenuItemViewModel> dishMenu; //私有变量、对应的数据属性2
        public List<DishMenuItemViewModel> DishMenu //DishMenuItemViewModel类组成的集合
        {
            get { return dishMenu; }
            set
            {
                dishMenu = value;
                this.RaisePropertyChanged("DishMenu");
            }
        }
        private int count; //私有变量、对应的数据属性3
        public int Count
        {
            get { return count; }
            set
            {
                count = value;
                this.RaisePropertyChanged("Count");
            }
        }
        #endregion
        #region 命令属性
        public DelegateCommand SelectMenuItemCommand { get; set; } //命令属性1
        public DelegateCommand PlaceOrderCommand { get; set; } //命令属性2
        #endregion

        public MainWindowViewModel()
        {
            this.LoadRestaurant();
            this.LoadDishMenu();
            this.SelectMenuItemCommand = new DelegateCommand(new Action(this.SelectMenuItemExecute)); //命令属性与方法联系起来
            this.PlaceOrderCommand = new DelegateCommand(new Action(this.PlaceOrderCommandExecute));            
        }
        private void LoadRestaurant() //数据属性1的方法
        {
            this.Restaurant = new Restaurant();
            this.Restaurant.Name = "Crazy大象";
            this.Restaurant.Address = "北京市海淀区万泉河路紫金庄园1号楼 1层 113室(亲们:这地儿特难找!)";
            this.Restaurant.PhoneNumber = "15210365423 or 82650336";
        }
        private void LoadDishMenu() //数据属性2的方法,加载所有菜品到DishMenu中
        {
            IDataService ds = new XmlDataService();
            var dishes = ds.GetAllDishes(); //得到所有菜品
            this.DishMenu = new List<DishMenuItemViewModel>();
            foreach (var dish in dishes)
            {
                DishMenuItemViewModel item = new DishMenuItemViewModel();
                item.Dish = dish;
                this.DishMenu.Add(item);
            }
        }
        private void SelectMenuItemExecute() //命令属性1的方法,被选中菜品的数量
        {
            this.Count = this.DishMenu.Count(i => i.IsSelected == true); //集合中元素的数量,Count是集合自带的方法
        }
        private void PlaceOrderCommandExecute() //命令属性2的方法,保存被选择的菜品
        {
            var selectedDishes = this.DishMenu.Where(i => i.IsSelected == true).Select(i => i.Dish.Name).ToList();
            IOrderService orderService = new SaveService();
            orderService.PlaceOrder(selectedDishes);
            MessageBox.Show("订餐成功!");
        }
    }
}

DishMenuItemViewModel.cs

using Demo0813.Models;
using Prism.Mvvm;

namespace Demo0813.ViewModels
{
    public class DishMenuItemViewModel : BindableBase 
    {
        public Dish Dish { get; set; } //数据属性

        private bool isSelected; //私有变量、对应的数据属性,此属性不展示,只作为选中与否的标记
        public bool IsSelected
        {
            get { return isSelected; }
            set
            {
                isSelected = value;
                this.RaisePropertyChanged("IsSelected");
            }
        }

        public DishMenuItemViewModel()
        {

        }
    }
}

IDataService.cs

using System.Collections.Generic;
using Demo0813.Models;

namespace Demo0813.Services
{
    interface IDataService //只定义不实现
    {
        List<Dish> GetAllDishes(); //定义方法
    }
}

IOrderService.cs

using System.Collections.Generic;

namespace Demo0813.Services
{
    interface IOrderService //只定义不实现
    {
        void PlaceOrder(List<string> dishes); //定义方法
    }
}

XmlDataService.cs

using System;
using System.Collections.Generic;
using Demo0813.Models;
using System.Xml.Linq;

namespace Demo0813.Services
{
    class XmlDataService : IDataService //实现接口,读取Data.xml中所有菜品
    {
        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(xmlFileName); //载入内容
            var dishes = xDoc.Descendants("Dish"); //Dish节点的所有子节点,descendant子代
            foreach (var d in dishes)
            {
                Dish dish = new Dish();
                dish.Name = d.Element("Name").Value;
                dish.Category = d.Element("Category").Value;
                dish.Comment = d.Element("Comment").Value;
                dish.Score = double.Parse(d.Element("Score").Value);
                dishList.Add(dish); //加载到表中
            }

            return dishList;
        }
    }
}

SaveService.cs

using System.Collections.Generic;

namespace Demo0813.Services
{
    class SaveService : IOrderService //实现接口
    {
        public void PlaceOrder(List<string> dishes)
        {
            System.IO.File.WriteAllLines(@"D:\order.txt", dishes.ToArray()); //D盘保存订餐结果
        }
    }
}

Dish.cs

using Prism.Mvvm;

namespace Demo0813.Models
{
    public class Dish : BindableBase
    {
        public string Name { get; set; }
        public string Category { get; set; }
        public string Comment { get; set; }
        public double Score { get; set; }
        public Dish()
        {

        }
    }
}

Restaurant.cs

using Prism.Mvvm;

namespace Demo0813.Models
{
    public class Restaurant : BindableBase //类,以及其中的属性
    {
        public string Name { get; set; }
        public string Address { get; set; }
        public string PhoneNumber { get; set; }
        public Restaurant()
        {

        }
    }
}

Data.xml

<?xml version="1.0" encoding="utf-8"?>
<Dishes>
    <Dish>
        <Name>土豆泥底披萨</Name>
        <Category>披萨</Category>
        <Comment>本店特色</Comment>
        <Score>4.5</Score>
    </Dish>
    <Dish>
        <Name>烤囊底披萨</Name>
        <Category>披萨</Category>
        <Comment>本店特色</Comment>
        <Score>5</Score>
    </Dish>
    <Dish>
        <Name>水果披萨</Name>
        <Category>披萨</Category>
        <Comment></Comment>
        <Score>4</Score>
    </Dish>
    <Dish>
        <Name>牛肉披萨</Name>
        <Category>披萨</Category>
        <Comment></Comment>
        <Score>5</Score>
    </Dish>
    <Dish>
        <Name>培根披萨</Name>
        <Category>披萨</Category>
        <Comment></Comment>
        <Score>4.5</Score>
    </Dish>
    <Dish>
        <Name>什锦披萨</Name>
        <Category>披萨</Category>
        <Comment></Comment>
        <Score>4.5</Score>
    </Dish>
    <Dish>
        <Name>金枪鱼披萨</Name>
        <Category>披萨</Category>
        <Comment></Comment>
        <Score>5</Score>
    </Dish>
    <Dish>
        <Name>海鲜披萨</Name>
        <Category>披萨</Category>
        <Comment></Comment>
        <Score>5</Score>
    </Dish>
    <Dish>
        <Name>川香披萨</Name>
        <Category>披萨</Category>
        <Comment></Comment>
        <Score>4.5</Score>
    </Dish>
    <Dish>
        <Name>黑椒鸡腿扒</Name>
        <Category>特色主食</Category>
        <Comment>本店特色</Comment>
        <Score>5</Score>
    </Dish>
    <Dish>
        <Name>肉酱意面</Name>
        <Category>特色主食</Category>
        <Comment>本店特色</Comment>
        <Score>5</Score>
    </Dish>
    <Dish>
        <Name>寂寞小章鱼</Name>
        <Category>风味小吃</Category>
        <Comment></Comment>
        <Score>5</Score>
    </Dish>
    <Dish>
        <Name>照烧鸡软骨</Name>
        <Category>风味小吃</Category>
        <Comment></Comment>
        <Score>5</Score>
    </Dish>
    <Dish>
        <Name>芝士青贝</Name>
        <Category>风味小吃</Category>
        <Comment></Comment>
        <Score>4.5</Score>
    </Dish>
    <Dish>
        <Name>奥尔良烤翅</Name>
        <Category>风味小吃</Category>
        <Comment>秒杀KFC</Comment>
        <Score>5</Score>
    </Dish>
    <Dish>
        <Name>双酱煎泥肠</Name>
        <Category>风味小吃</Category>
        <Comment></Comment>
        <Score>4</Score>
    </Dish>
    <Dish>
        <Name>香酥鱿鱼圈</Name>
        <Category>风味小吃</Category>
        <Comment>本店特色</Comment>
        <Score>4.5</Score>
    </Dish>
    <Dish>
        <Name>黄金蝴蝶虾</Name>
        <Category>风味小吃</Category>
        <Comment>本店特色</Comment>
        <Score>5</Score>
    </Dish>
    <Dish>
        <Name>金枪鱼沙拉</Name>
        <Category>沙拉</Category>
        <Comment>本店特色</Comment>
        <Score>5</Score>
    </Dish>
    <Dish>
        <Name>日式素沙拉</Name>
        <Category>沙拉</Category>
        <Comment></Comment>
        <Score>5</Score>
    </Dish>
    <Dish>
        <Name>冰糖洛神</Name>
        <Category>饮料</Category>
        <Comment></Comment>
        <Score>5</Score>
    </Dish>
    <Dish>
        <Name>玫瑰特饮</Name>
        <Category>饮料</Category>
        <Comment></Comment>
        <Score>5</Score>
    </Dish>
    <Dish>
        <Name>清新芦荟</Name>
        <Category>饮料</Category>
        <Comment></Comment>
        <Score>5</Score>
    </Dish>
    <Dish>
        <Name>薄荷汽水</Name>
        <Category>饮料</Category>
        <Comment>本店特色</Comment>
        <Score>5</Score>
    </Dish>
</Dishes>

 

posted @ 2019-08-15 17:29  夕西行  阅读(1475)  评论(2编辑  收藏  举报