> 技术文档 > WPF&C#超市管理系统(3)商品管理

WPF&C#超市管理系统(3)商品管理


超市管理系统

    • 6. 商品管理
      • 6.1 添加商品
      • 6.1 商品管理主界面
      • 6.3 修改商品

6. 商品管理

  • 将前文中的GoodsView全部改成和数据库一致的ProductView
  • 新增枚举类型商品类型ProductType.cs
namespace 超市管理系统.Enums{ public enum ProductType { 水果类, 休闲食品类, 粮油类, 饮料类, 日用品 }}
  • 新增枚举类型商品单位UnitType.cs
namespace 超市管理系统.Entity{ public enum UnitType {,,,,,,}}

6.1 添加商品

  • 将数据库Product表的Category从int改为nvarchar(50),在Visual Studio中删掉Product表并从模型更新新表
  • 新增AddProductView.xaml,复用AddCustomerView.xaml并修改,新增加ImageSource属性和上传图片的SelectImageCommand命令。
  • AddCustomerViewModel内增加SupplierList属性SupplierList属性supplierProvider字段supplierProvider字段用于添加商品界面初次打开时加载当前现有供应商,并赋值给SupplierList属性SupplierList属性为Combox的当前选择项。
  • 单价虽然为double类型,但是输入框中无法输入小数点,需要将UpdateSourceTrigger设置为LostFocus,因为PropertyChanged是立即更新,不认小数点。而失去焦点时更新可以有小数点。
<Window x:Class=\"超市管理系统.View.AddProductView\" xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\" xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\" xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\" xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\" xmlns:local=\"clr-namespace:超市管理系统.View\" mc:Ignorable=\"d\" xmlns:i=\"http://schemas.microsoft.com/expression/2010/interactivity\" WindowStartupLocation=\"CenterScreen\" DataContext=\"{Binding Source={StaticResource Locator}, Path=AddProductViewModel}\" Title=\"商品管理\" Height=\"450\" Width=\"650\"> <i:Interaction.Triggers> <i:EventTrigger EventName =\"Loaded\"> <i:InvokeCommandAction Command=\"{Binding LoadedCommand}\" CommandParameter=\"{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Window}}\"/> </i:EventTrigger> </i:Interaction.Triggers> <Grid> <Grid.RowDefinitions> <RowDefinition Height=\"auto\"/> <RowDefinition/> <RowDefinition Height=\"auto\"/> </Grid.RowDefinitions> <Grid Grid.Row=\"0\" Height=\"50\" Background=\"{Binding AppData.Background}\">  <TextBlock Text=\"商品管理\" FontSize=\"24\" Foreground=\"White\" VerticalAlignment=\"Center\" HorizontalAlignment=\"Center\"/> </Grid> <Grid Grid.Row=\"1\"> <Grid.ColumnDefinitions> <ColumnDefinition/> <ColumnDefinition/> </Grid.ColumnDefinitions> <StackPanel Grid.Row=\"0\" Margin=\"10\" HorizontalAlignment=\"Center\" > <StackPanel Orientation=\"Horizontal\" Height=\"30\" Margin=\"0 5 0 10\">  <TextBlock Text=\"供应商:\" Width=\"70\" FontSize=\"18\" VerticalAlignment=\"Center\"/>  <ComboBox ItemsSource=\"{Binding SupplierList}\" SelectedItem=\"{Binding Supplier}\" DisplayMemberPath=\"Name\" MinWidth=\"200\"/> </StackPanel> <StackPanel Orientation=\"Horizontal\" Height=\"30\" Margin=\"0 5 0 10\">  <TextBlock Text=\"单 位:\" Width=\"70\" FontSize=\"18\" VerticalAlignment=\"Center\"/>  <ComboBox ItemsSource=\"{Binding Product.Units}\" SelectedItem=\"{Binding Product.Unit}\" Width=\"200\" /> </StackPanel> <StackPanel Orientation=\"Horizontal\" Height=\"30\" Margin=\"0 5 0 10\">  <TextBlock Text=\"类 型:\" Width=\"70\" FontSize=\"18\" VerticalAlignment=\"Center\"/>  <ComboBox ItemsSource=\"{Binding Product.ProductType}\" SelectedItem=\"{Binding Product.Category}\" Width=\"200\" /> </StackPanel> <StackPanel Orientation=\"Horizontal\" Height=\"30\" Margin=\"0 5 0 10\">  <TextBlock Text=\"商品名:\" Width=\"70\" FontSize=\"18\" VerticalAlignment=\"Center\"/>  <TextBox Text=\"{Binding Product.Name, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}\" Width=\"200\" Height=\"30\" VerticalAlignment=\"Center\"/> </StackPanel> <StackPanel Orientation=\"Horizontal\" Height=\"30\" Margin=\"0 5 0 10\">  <TextBlock Text=\"单 价:\" Width=\"70\" FontSize=\"18\" VerticalAlignment=\"Center\"/>  <TextBox Text=\"{Binding Product.Price, Mode=TwoWay, UpdateSourceTrigger=LostFocus}\" Width=\"200\" Height=\"30\" VerticalAlignment=\"Center\"/> </StackPanel> <StackPanel Orientation=\"Horizontal\" Height=\"30\" Margin=\"0 5 0 10\">  <TextBlock Text=\"库 存:\" Width=\"70\" FontSize=\"18\" VerticalAlignment=\"Center\"/>  <TextBox Text=\"{Binding Product.Quantity, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}\" Width=\"200\" /> </StackPanel> </StackPanel> <Grid Grid.Column=\"1\" Margin=\"10\" Background=\"#E2E2E2\"> <TextBlock Text=\"选择商品图片\" HorizontalAlignment=\"Center\" VerticalAlignment=\"Center\"/> <Border Background=\"Transparent\">  <i:Interaction.Triggers> <i:EventTrigger EventName=\"MouseUp\"> <i:InvokeCommandAction Command=\"{Binding SelectImageCommand}\"/> </i:EventTrigger>  </i:Interaction.Triggers>  <Image Source=\"{Binding ImageSource}\">  </Image> </Border> </Grid> </Grid> <StackPanel Grid.Row=\"2\" Margin=\"10\" Orientation=\"Horizontal\" HorizontalAlignment=\"Right\"> <Button x:Name=\"button1\" Content=\"新增\" Command=\"{Binding AddCommand}\" CommandParameter=\"{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Window}}\" Margin=\"10\" Width=\"60\" Height=\"25\"/> <Button x:Name=\"button2\" Content=\"关闭\" Command=\"{Binding ExitCommand}\" CommandParameter=\"{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Window}}\" Margin=\"10\" Width=\"60\" Height=\"25\"/> </StackPanel> </Grid></Window>
  • AddCustomerViewModel.cs包含属性由下拉框的供应商列表、单位、类型、商品名、单价、库存,以及当前供应商等内容,实现代码如下:
  • 注意需要为新增按钮增加Product.SupplierId = Supplier.Id 将当前供应商Id传入
using GalaSoft.MvvmLight.Command;using Microsoft.Win32;using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Windows;using System.Windows.Media.Imaging;using 超市管理系统.Entity;using 超市管理系统.Helper;namespace 超市管理系统.ViewModel{ public class AddProductViewModel : ViewModelBase2 { private ProductProvider productProvider = new ProductProvider(); private Product product; public Product Product { get { return product; } set { product = value; RaisePropertyChanged(); } }  private SupplierProvider supplierProvider = new SupplierProvider(); private List<Supplier> supplierList = new List<Supplier>(); public List<Supplier> SupplierList { get { return supplierList; } set {  supplierList = value;  RaisePropertyChanged(); } } private Supplier supplier; public Supplier Supplier { get { return supplier; } set { supplier = value; RaisePropertyChanged(); } } #region commands public RelayCommand<Window> LoadedCommand { get { return new RelayCommand<Window>((view) => {  Product = new Product();  SupplierList = supplierProvider.GetAll();  ImageSource = null;  Supplier = null; }); } } public RelayCommand<Window> AddCommand { get { return new RelayCommand<Window>((view) => {  if (string.IsNullOrEmpty(Product.Name))  { MessageBox.Show(\"姓名不能为空!\"); return;  }  Product.SupplierId = Supplier.Id;//将当前供应商Id传入  Product.InsertDate = DateTime.Now;  int count = productProvider.Insert(Product);  if (count > 0)  { MessageBox.Show(\"操作成功!\");  }  view.DialogResult = true;  view.Close(); }); } } //当前商品图片 private BitmapImage imageSourece; public BitmapImage ImageSource { get { return imageSourece; } set { imageSourece = value; RaisePropertyChanged(); } } public RelayCommand<Window> SelectImageCommand { get { return new RelayCommand<Window>((view) => {  OpenFileDialog openFileDialog = new OpenFileDialog();  //对话框标题  openFileDialog.Title = \"选择图片\";  //设置文件类型  openFileDialog.Filter = \"图片文件(*.jpg)|*.jpg|所有文件(*.*)|*.*\";  //默认文件顺序  openFileDialog.FilterIndex = 1;  //不可多选  openFileDialog.Multiselect = false;  //记忆上次打开目录  openFileDialog.RestoreDirectory = true;  if (openFileDialog.ShowDialog().Value == true)  { string fileName = openFileDialog.FileName; ImageSource = new BitmapImage(new Uri(fileName)); product.Image = ImageHelper.GetImageString(fileName); //测试转换是否正常 var s = ImageHelper.GetBitmapImage(product.Image); ImageSource = s;  } }); } } public RelayCommand<Window> ExitCommand { get { return new RelayCommand<Window>((view) => {  Product = new Product(); }); } } #endregion }}

在这里插入图片描述

  • 新增商品时添加的图片需要将图片转换为二进制流。在项目新建Helper文件夹,增加ImageHelper类包含函数GetImageString获取图片二进制流和GetBitmapImage二进制流转化为图片
using System;using System.Collections.Generic;using System.IO;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Windows;using System.Windows.Media.Imaging;namespace 超市管理系统.Helper{ public class ImageHelper { ///  /// 获取图片的二进制流 ///  ///  public static string GetImageString(string fileName) { try { FileStream fileStream = new FileStream(fileName, FileMode.Open, FileAccess.Read); byte[] buffer = new byte[fileStream.Length]; fileStream.Read(buffer, 0, buffer.Length);//从fileStream中读取数据,写入buffer中 return Convert.ToBase64String(buffer); } catch (Exception e) { MessageBox.Show(e.Message); return string.Empty; } } ///  /// 二进制流转换成图片资源 ///  ///  ///  public static BitmapImage GetBitmapImage(string _buffer) { BitmapImage image = new BitmapImage(); try { byte[] buffer = Convert.FromBase64String(_buffer); MemoryStream stream = new MemoryStream(buffer, 0, buffer.Length); stream.Write(buffer, 0, buffer.Length); stream.Position = 0; image.BeginInit(); image.CacheOption = BitmapCacheOption.OnLoad; image.StreamSource = stream; image.EndInit(); image.Freeze(); return image; } catch (Exception e) { MessageBox.Show(e.Message); return image; } } }}

6.1 商品管理主界面

  • ProductView.xaml内容复用CustomerView.xaml并将Customer修改为Product,将绑定的属性改为Product属性
  • 通过Image.ToolTip将鼠标悬停可实现图片放大
<UserControl x:Class=\"超市管理系统.View.ProductView\" xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\" xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\" xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"  xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"  xmlns:local=\"clr-namespace:超市管理系统.View\" xmlns:i=\"http://schemas.microsoft.com/expression/2010/interactivity\" mc:Ignorable=\"d\"  Background=\"{Binding AppData.Background}\" DataContext=\"{Binding Source={StaticResource Locator}, Path=ProductViewModel}\" d:DesignHeight=\"450\" d:DesignWidth=\"800\"> <i:Interaction.Triggers> <i:EventTrigger EventName =\"Loaded\"> <i:InvokeCommandAction Command=\"{Binding LoadedCommand}\" CommandParameter=\"{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=UserControl}}\"/> </i:EventTrigger> </i:Interaction.Triggers> <Grid> <Grid.RowDefinitions> <RowDefinition Height=\"40\"/> <RowDefinition/> </Grid.RowDefinitions> <Border BorderBrush=\"#22304B\" BorderThickness=\"0 0 0 1\"> <TextBlock Text=\"商品管理\" VerticalAlignment=\"center\" Margin=\"5 0 0 0\" Foreground=\"{Binding AppData.Foreground}\" FontSize=\"16\"/> </Border> <Grid Grid.Row=\"1\"> <Grid.RowDefinitions> <RowDefinition/> <RowDefinition Height=\"auto\"/> </Grid.RowDefinitions> <DataGrid ItemsSource=\"{Binding ProductList}\"  SelectedItem=\"{Binding SelectedProduct}\"  Style=\"{StaticResource DataGridStyle}\"> <DataGrid.Columns>    <!--   -->    <DataGridTemplateColumn Width=\"auto\" Header=\"序号\"> <DataGridTemplateColumn.CellTemplate> <DataTemplate> <Grid>  <TextBox Text=\"{Binding Id,Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}\" Style=\"{StaticResource DataGridTextBoxStyle}\"/> </Grid> </DataTemplate> </DataGridTemplateColumn.CellTemplate>  </DataGridTemplateColumn>  <DataGridTemplateColumn Width=\"auto\" Header=\"商品名称\"> <DataGridTemplateColumn.CellTemplate> <DataTemplate> <Grid>  <TextBox Text=\"{Binding Name, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}\"/> </Grid> </DataTemplate> </DataGridTemplateColumn.CellTemplate>  </DataGridTemplateColumn>  <DataGridTemplateColumn Width=\"auto\" Header=\"商品图片\"> <DataGridTemplateColumn.CellTemplate> <DataTemplate> <Grid>  <Image Source=\"{Binding BitmapImage}\" >  <Image.ToolTip><Grid> <Image Source=\"{Binding BitmapImage}\"/></Grid>  </Image.ToolTip>  </Image> </Grid> </DataTemplate> </DataGridTemplateColumn.CellTemplate>  </DataGridTemplateColumn>  <DataGridTemplateColumn Width=\"auto\" Header=\"单价\"> <DataGridTemplateColumn.CellTemplate> <DataTemplate> <Grid>  <TextBox Text=\"{Binding Price, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}\" Style=\"{StaticResource DataGridTextBoxStyle}\" HorizontalAlignment=\"Left\"/> </Grid> </DataTemplate> </DataGridTemplateColumn.CellTemplate>  </DataGridTemplateColumn>  <DataGridTemplateColumn Width=\"auto\" Header=\"单位\"> <DataGridTemplateColumn.CellTemplate> <DataTemplate> <Grid>  <TextBox Text=\"{Binding Unit, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}\" Style=\"{StaticResource DataGridTextBoxStyle}\" HorizontalAlignment=\"Left\"/> </Grid> </DataTemplate> </DataGridTemplateColumn.CellTemplate>  </DataGridTemplateColumn>  <DataGridTemplateColumn Width=\"auto\" Header=\"分类\"> <DataGridTemplateColumn.CellTemplate> <DataTemplate> <Grid>  <TextBox Text=\"{Binding Category, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}\" Style=\"{StaticResource DataGridTextBoxStyle}\" HorizontalAlignment=\"Left\"/> </Grid> </DataTemplate> </DataGridTemplateColumn.CellTemplate>  </DataGridTemplateColumn>  <DataGridTemplateColumn Width=\"auto\" Header=\"单位\"> <DataGridTemplateColumn.CellTemplate> <DataTemplate> <Grid>  <TextBox Text=\"{Binding Quantity, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}\" Style=\"{StaticResource DataGridTextBoxStyle}\" HorizontalAlignment=\"Left\"/> </Grid> </DataTemplate> </DataGridTemplateColumn.CellTemplate>  </DataGridTemplateColumn>  <DataGridTemplateColumn Width=\"auto\" Header=\"日期\"> <DataGridTemplateColumn.CellTemplate> <DataTemplate> <Grid>  <TextBox Text=\"{Binding InsertDate, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}\" Style=\"{StaticResource DataGridTextBoxStyle}\" HorizontalAlignment=\"Left\"/> </Grid> </DataTemplate> </DataGridTemplateColumn.CellTemplate>  </DataGridTemplateColumn> </DataGrid.Columns> </DataGrid> <Grid Grid.Row=\"1\"> <Grid.ColumnDefinitions>  <ColumnDefinition/>  <ColumnDefinition/> </Grid.ColumnDefinitions> <StackPanel Grid.Column=\"0\" Margin=\"0 5 5 5\" Orientation=\"Horizontal\" HorizontalAlignment=\"Left\" VerticalAlignment=\"Center\">  <TextBlock Text=\"当前商品:\" Margin=\"0 0 10 0\" Foreground=\"White\" Width=\"auto\" />  <TextBlock Text=\"{Binding SelectedProduct.Name}\" Foreground=\"White\" Width=\"auto\"/> </StackPanel> <StackPanel Grid.Column=\"1\" Margin=\"0 5 5 5\" Orientation=\"Horizontal\" HorizontalAlignment=\"Right\">  <Button Content=\"新增商品\" Command=\"{Binding OpenAddViewCommand}\" Margin=\"0 0 10 0\" Width=\"80\" Height=\"25\"/>  <Button Content=\"删除商品\" Command=\"{Binding DeleteCommand}\" Margin=\"0 0 10 0\" Width=\"80\" Height=\"25\"/>  <Button Content=\"修改\" Command=\"{Binding EditCommand}\" Width=\"80\" Margin=\"0 0 10 0\" Height=\"25\"/>  <Button Content=\"保存\" Command=\"{Binding SaveCommand}\" Width=\"80\" Margin=\"0 0 10 0\" Height=\"25\"/> </StackPanel> </Grid> </Grid> </Grid></UserControl>
  • ProductViewModel.cs内实现代码如下:
using CommonServiceLocator;using GalaSoft.MvvmLight.Command;using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Windows;using System.Windows.Controls;using 超市管理系统.Entity;using 超市管理系统.View;namespace 超市管理系统.ViewModel{ public class ProductViewModel : ViewModelBase2 { private ProductProvider productProvider = new ProductProvider(); private List<Product> productList = new List<Product>(); public List<Product> ProductList { get { return productList; } set { productList = value; RaisePropertyChanged(); } } //当前选中的顾客实体 private Product selectedProduct; public Product SelectedProduct { get { return selectedProduct; } set { selectedProduct = value; RaisePropertyChanged(); } } #region commands ///  /// 加载所有供应商 ///  public RelayCommand<UserControl> LoadedCommand { get { return new RelayCommand<UserControl>((view) => {  ProductList = productProvider.GetAll(); }); } } public RelayCommand<UserControl> OpenAddViewCommand { get { return new RelayCommand<UserControl>((view) => {  AddProductView addProductView = new AddProductView();  if (addProductView.ShowDialog().Value == true)  { ProductList = productProvider.GetAll();  } }); } } public RelayCommand<UserControl> DeleteCommand { get { return new RelayCommand<UserControl>((view) => {  if (SelectedProduct == null) { return; }  if (Dialog.Show() == true)  { var count = productProvider.Delete(SelectedProduct); if (count > 0) { MessageBox.Show(\"删除成功\"); ProductList = productProvider.GetAll(); }  } }); } } public RelayCommand<UserControl> SaveCommand { get { return new RelayCommand<UserControl>((view) => {  var count = productProvider.Save();  if (count > 0)  { MessageBox.Show(\"保存成功\"); ProductList = productProvider.GetAll();  } }); } } public RelayCommand<Window> EditCommand { get { return new RelayCommand<Window>((view) => {  if (SelectedProduct == null) { return; }  var vm = ServiceLocator.Current.GetInstance<EditProductViewModel>();  vm.Product = SelectedProduct;  EditProductView editProductView = new EditProductView();  if (editProductView.ShowDialog().Value == true)  { ProductList = productProvider.GetAll();  } }); } } #endregion }}

在这里插入图片描述

6.3 修改商品

  • 新增EditProductView.xaml,复用EditCustomerView.xaml并修改,包含属性由下拉框的供应商列表、单位、类型、商品名、单价、库存,以及当前供应商等内容。
<Window x:Class=\"超市管理系统.View.EditProductView\" xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\" xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\" xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\" xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\" xmlns:local=\"clr-namespace:超市管理系统.View\" xmlns:i=\"http://schemas.microsoft.com/expression/2010/interactivity\" mc:Ignorable=\"d\" WindowStartupLocation=\"CenterScreen\" DataContext=\"{Binding Source={StaticResource Locator}, Path=EditProductViewModel}\" Title=\"修改商品\" Height=\"450\" Width=\"650\"> <i:Interaction.Triggers> <i:EventTrigger EventName =\"Loaded\"> <i:InvokeCommandAction Command=\"{Binding LoadedCommand}\" CommandParameter=\"{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Window}}\"/> </i:EventTrigger> </i:Interaction.Triggers> <Grid> <Grid.RowDefinitions> <RowDefinition Height=\"auto\"/> <RowDefinition/> <RowDefinition Height=\"auto\"/> </Grid.RowDefinitions> <Grid Grid.Row=\"0\" Height=\"50\" Background=\"{Binding AppData.Background}\">  <TextBlock Text=\"修改商品\" FontSize=\"24\" Foreground=\"White\" VerticalAlignment=\"Center\" HorizontalAlignment=\"Center\"/> </Grid> <Grid Grid.Row=\"1\"> <Grid.ColumnDefinitions> <ColumnDefinition/> <ColumnDefinition/> </Grid.ColumnDefinitions> <StackPanel Grid.Row=\"0\" Margin=\"10\" HorizontalAlignment=\"Center\" > <StackPanel Orientation=\"Horizontal\" Height=\"30\" Margin=\"0 5 0 10\">  <TextBlock Text=\"供应商:\" Width=\"70\" FontSize=\"18\" VerticalAlignment=\"Center\"/>  <ComboBox ItemsSource=\"{Binding SupplierList}\" SelectedItem=\"{Binding Supplier}\" DisplayMemberPath=\"Name\" MinWidth=\"200\"/> </StackPanel> <StackPanel Orientation=\"Horizontal\" Height=\"30\" Margin=\"0 5 0 10\">  <TextBlock Text=\"单 位:\" Width=\"70\" FontSize=\"18\" VerticalAlignment=\"Center\"/>  <ComboBox ItemsSource=\"{Binding Product.Units}\" SelectedItem=\"{Binding Product.Unit}\" Width=\"200\" /> </StackPanel> <StackPanel Orientation=\"Horizontal\" Height=\"30\" Margin=\"0 5 0 10\">  <TextBlock Text=\"类 型:\" Width=\"70\" FontSize=\"18\" VerticalAlignment=\"Center\"/>  <ComboBox ItemsSource=\"{Binding Product.ProductType}\" SelectedItem=\"{Binding Product.Category}\" Width=\"200\" /> </StackPanel> <StackPanel Orientation=\"Horizontal\" Height=\"30\" Margin=\"0 5 0 10\">  <TextBlock Text=\"商品名:\" Width=\"70\" FontSize=\"18\" VerticalAlignment=\"Center\"/>  <TextBox Text=\"{Binding Product.Name, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}\" Width=\"200\" Height=\"30\" VerticalAlignment=\"Center\"/> </StackPanel> <StackPanel Orientation=\"Horizontal\" Height=\"30\" Margin=\"0 5 0 10\">  <TextBlock Text=\"单 价:\" Width=\"70\" FontSize=\"18\" VerticalAlignment=\"Center\"/>  <TextBox Text=\"{Binding Product.Price, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}\" Width=\"200\" Height=\"30\" VerticalAlignment=\"Center\"/> </StackPanel> <StackPanel Orientation=\"Horizontal\" Height=\"30\" Margin=\"0 5 0 10\">  <TextBlock Text=\"库 存:\" Width=\"70\" FontSize=\"18\" VerticalAlignment=\"Center\"/>  <TextBox Text=\"{Binding Product.Quantity, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}\" Width=\"200\" /> </StackPanel> </StackPanel> <Grid Grid.Column=\"1\" Margin=\"10\" Background=\"#E2E2E2\"> <TextBlock Text=\"选择商品图片\" HorizontalAlignment=\"Center\" VerticalAlignment=\"Center\"/> <Border Background=\"Transparent\">  <i:Interaction.Triggers> <i:EventTrigger EventName=\"MouseUp\"> <i:InvokeCommandAction Command=\"{Binding SelectImageCommand}\"/> </i:EventTrigger>  </i:Interaction.Triggers>  <Image Source=\"{Binding ImageSource}\">  </Image> </Border> </Grid> </Grid> <StackPanel Grid.Row=\"2\" Margin=\"10\" Orientation=\"Horizontal\" HorizontalAlignment=\"Right\"> <Button x:Name=\"button1\" Content=\"确定\" Command=\"{Binding OKCommand}\" CommandParameter=\"{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Window}}\" Margin=\"10\" Width=\"60\" Height=\"25\"/> <Button x:Name=\"button2\" Content=\"关闭\" Command=\"{Binding ExitCommand}\" CommandParameter=\"{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Window}}\" Margin=\"10\" Width=\"60\" Height=\"25\"/> </StackPanel> </Grid></Window>
  • EditProductViewModel.cs复用 AddProductViewModel.cs内的代码与命令。在OK按钮的命令中需要Product.SupplierId = Supplier.Id; 将当前供应商Id传入
using GalaSoft.MvvmLight.Command;using Microsoft.Win32;using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Windows;using System.Windows.Media;using System.Windows.Media.Imaging;using 超市管理系统.Entity;using 超市管理系统.Helper;namespace 超市管理系统.ViewModel{ public class EditProductViewModel : ViewModelBase2 { private ProductProvider productProvider = new ProductProvider(); private Product product; public Product Product { get { return product; } set { product = value; RaisePropertyChanged(); } } private SupplierProvider supplierProvider = new SupplierProvider(); private List<Supplier> supplierList = new List<Supplier>(); public List<Supplier> SupplierList { get { return supplierList; } set { supplierList = value; RaisePropertyChanged(); } } private Supplier supplier; public Supplier Supplier { get { return supplier; } set { supplier = value; RaisePropertyChanged(); } } //当前商品图片 private BitmapImage imageSourece; public BitmapImage ImageSource { get { return imageSourece; } set { imageSourece = value; RaisePropertyChanged(); } } #region commands public RelayCommand<Window> LoadedCommand { get { return new RelayCommand<Window>((view) => {  ImageSource = Product.BitmapImage;  SupplierList = supplierProvider.GetAll();  Supplier = SupplierList.FirstOrDefault(t => t.Id == Product.SupplierId); }); } } public RelayCommand<Window> SelectImageCommand { get { return new RelayCommand<Window>((view) => {  OpenFileDialog openFileDialog = new OpenFileDialog();  //对话框标题  openFileDialog.Title = \"选择图片\";  //设置文件类型  openFileDialog.Filter = \"图片文件(*.jpg)|*.jpg|所有文件(*.*)|*.*\";  //默认文件顺序  openFileDialog.FilterIndex = 1;  //不可多选  openFileDialog.Multiselect = false;  //记忆上次打开目录  openFileDialog.RestoreDirectory = true;  if (openFileDialog.ShowDialog().Value == true)  { string fileName = openFileDialog.FileName; ImageSource = new BitmapImage(new Uri(fileName)); product.Image = ImageHelper.GetImageString(fileName); //测试转换是否正常 //var s = ImageHelper.GetBitmapImage(product.Image); //ImageSource = s;  } }); } } public RelayCommand<Window> OKCommand { get { return new RelayCommand<Window>((view) => {  if (string.IsNullOrEmpty(Product.Name))  { MessageBox.Show(\"姓名不能为空!\"); return;  }  Product.SupplierId = Supplier.Id;//将当前供应商Id传入  //Product.InsertDate = DateTime.Now;  int count = productProvider.Update(Product);  if (count > 0)  { MessageBox.Show(\"操作成功!\");  }  view.DialogResult = true;  view.Close(); }); } } public RelayCommand<Window> ExitCommand { get { return new RelayCommand<Window>((view) => {  Product = new Product(); }); } } #endregion }}

在这里插入图片描述