zoukankan      html  css  js  c++  java
  • 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, @"DataData.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>
  • 相关阅读:
    20172328《程序设计与数据结构》实验一报告
    20172328《程序设计与数据结构》第三周学习总结
    20172328《程序设计与数据结构》第二周学习总结
    20172328《程序设计与数据结构》第一周学习总结
    预备作业03
    预备作业02
    寒假作业01
    竹杖芒鞋轻胜马,谁怕?一蓑烟雨任平生
    Java全栈第二篇-IDEA的安装及教育包领取(高校免费一年)和入门教程
    Java全栈第一篇-流程控制语句
  • 原文地址:https://www.cnblogs.com/xixixing/p/11359371.html
Copyright © 2011-2022 走看看