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>