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

发布于:2025-07-31 ⋅ 阅读:(16) ⋅ 点赞:(0)


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设置height时,VerticalAlignment不生效,此地设置给grid-->
            <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
    {
        /// <summary>
        /// 获取图片的二进制流
        /// </summary>
        /// <param name="fileName"></param>
        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;
            }
        }

        /// <summary>
        /// 二进制流转换成图片资源
        /// </summary>
        /// <param name="fileName"></param>
        /// <returns></returns>
        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>
                    <!--普通写法-->
                    <!--<DataGridTextColumn Width="auto" Binding="{Binding Id}" Header="序号"/>
         <DataGridTextColumn Width="auto" Binding="{Binding Name}" Header="姓名"/>
         <DataGridTextColumn Width="auto" Binding="{Binding Telephone}" Header="电话"/>
         <DataGridTextColumn Width="auto" Binding="{Binding Address}" Header="地址"/>-->

                    <!--数据模板写法-->
                    <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
        /// <summary>
        /// 加载所有供应商
        /// </summary>
        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设置height时,VerticalAlignment不生效,此地设置给grid-->
            <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
    }
}

在这里插入图片描述


网站公告

今日签到

点亮在社区的每一天
去签到