WPF&C#超市管理系统

    • 10. 订单详情
      • 10.1 页面布局
      • 10.2 功能实现
    • 11. 顾客注册
    • 12. 商品销售排行查询与库存提示
    • 14. LiveChart报表
  • 总结


10. 订单详情

10.1 页面布局

  • 页面分三行布置,第一行复用OutstorageView界面的第一行,将属性和命令修改为顾客相关
  • 第二行复用CustomerOrderView页面内展示内容,并设置订单初始化
  • 第三行为Order增加销售总额 和订单数量 两个属性
<UserControl x:Class="超市管理系统.View.OrderDetailView"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=OrderDetailViewModel}"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 Height="auto"/><RowDefinition/><RowDefinition Height="auto"/></Grid.RowDefinitions><Grid><StackPanel Orientation="Horizontal" Margin="0 5 0 5"><TextBlock Text="选择顾客" VerticalAlignment="Center" Foreground="White" Margin="5 0 5 0"/><ComboBox VerticalContentAlignment="Center" MinWidth="100" MaxWidth="200" Margin="5 0 5 0" Height="25"ItemsSource="{Binding CustomerList }"SelectedItem="{Binding SelectedCustomer}" DisplayMemberPath="Name"/><Button Content="查询" Command="{Binding SelectCommand}"  Width="80" Margin="0 0 10 0" Height="25"/><Button Content="全部" Command="{Binding SearchCommand}"  Width="80" Margin="0 0 10 0" Height="25"/></StackPanel></Grid><ScrollViewer Grid.Row="1"><ItemsControl ItemsSource="{Binding OrderList}" ><ItemsControl.ItemsPanel><ItemsPanelTemplate><StackPanel/></ItemsPanelTemplate></ItemsControl.ItemsPanel><ItemsControl.ItemTemplate><DataTemplate><Border BorderBrush="#505B70" BorderThickness="1" Margin="10"><Grid ><Grid.RowDefinitions><RowDefinition /><RowDefinition/></Grid.RowDefinitions><Border Grid.Row="0" Height="30" Background="#505B70"><Grid><TextBlock  HorizontalAlignment="Left" VerticalAlignment="Center"><Run Text="  顾客姓名:"/><Run Text="{Binding CustomerName, Mode=OneWay}" Foreground="White"/><Run Text="  订单号:"/><Run Text="{Binding SN}" Foreground="White"/><Run Text="  状态:"/><Run Text="{Binding OrderState}" Foreground="White"/><Run Text="  支付时间:"/><Run Text="{Binding PayDate}" Foreground="White"/><Run Text="  总金额:"/><Run Text="{Binding SumPrice }" Foreground="White"/></TextBlock></Grid></Border><Border Grid.Row="1"><DataGrid ItemsSource="{Binding Children}" Style="{StaticResource DataGridStyle}"><DataGrid.Columns><!--数据模板写法--><DataGridTemplateColumn Width="auto" Header="商品名称"><DataGridTemplateColumn.CellTemplate><DataTemplate><Grid><TextBox Text="{Binding ProductTitle, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}" Style="{StaticResource DataGridTextBoxStyle}"/></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=OneWay, UpdateSourceTrigger=LostFocus}" Style="{StaticResource DataGridTextBoxStyle}" HorizontalAlignment="Left"/></Grid></DataTemplate></DataGridTemplateColumn.CellTemplate></DataGridTemplateColumn><DataGridTemplateColumn Width="auto" Header="数量"><DataGridTemplateColumn.CellTemplate><DataTemplate><Grid><TextBox Text="{Binding QuantityEx, Mode=OneWay, 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=OneWay, UpdateSourceTrigger=PropertyChanged}" Style="{StaticResource DataGridTextBoxStyle}" HorizontalAlignment="Left"/></Grid></DataTemplate></DataGridTemplateColumn.CellTemplate></DataGridTemplateColumn></DataGrid.Columns></DataGrid></Border></Grid></Border></DataTemplate></ItemsControl.ItemTemplate></ItemsControl></ScrollViewer><Grid Grid.Row="2"><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 0 0" Foreground="White" Width="auto" /><TextBlock Text="{Binding SumMoney, StringFormat={}{0:C}}" Foreground="White"  Width="auto"/><TextBlock Text="订单数量:"  Margin="10 0 10 0" Foreground="White" Width="auto" /><TextBlock Text="{Binding SumOrderCount}" Foreground="White"  Width="auto"/></StackPanel><StackPanel Grid.Column="1"  Margin="0 5 5 5" Orientation="Horizontal" HorizontalAlignment="Right"><!--<Button Content="删除" Command="{Binding DeleteCommand}" Margin="0 0 10 0" Width="80" Height="25" />--></StackPanel></Grid></Grid></Grid>
</UserControl>

10.2 功能实现

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.Model;
using 超市管理系统.Entity;
using System.Collections.ObjectModel;namespace 超市管理系统.ViewModel
{public class OrderDetailViewModel : ViewModelBase2{public static OrderDetailProvider orderDetailProvider = new OrderDetailProvider();private List<Customer> customerList = new List<Customer>();public List<Customer> CustomerList{get { return customerList; }set{customerList = value;RaisePropertyChanged();}}//当前选中的顾客实体private Customer selectedCustomer;public Customer SelectedCustomer{get { return selectedCustomer; }set{selectedCustomer = value;RaisePropertyChanged();}}private ObservableCollection<Order> orders = new ObservableCollection<Order>();public ObservableCollection<Order> OrderList{get { return orders; }set { orders = value; RaisePropertyChanged(); }}private double sumMoney;/// <summary>/// 扩展属性,合计金额/// </summary>public double SumMoney{get { return sumMoney; }set{sumMoney = value; RaisePropertyChanged();}}private double sumOrderCount;/// <summary>/// 扩展属性,合计数量/// </summary>public double SumOrderCount{get { return sumOrderCount; }set{sumOrderCount = value; RaisePropertyChanged();}}#region commands/// <summary>/// 加载所有记录/// </summary>public RelayCommand<UserControl> LoadedCommand{get{return new RelayCommand<UserControl>((view) =>{CustomerList = CustomerViewModel.customerProvider.GetAll();SelectedCustomer = null;InitOrder();});}}/// <summary>/// 加载所选顾客订单详情/// </summary>public RelayCommand<UserControl> SelectCommand{get{return new RelayCommand<UserControl>((view) =>{if (selectedCustomer == null) return;InitOrder(selectedCustomer);});}}//查询所有顾客订单public RelayCommand<UserControl> SearchCommand{get{return new RelayCommand<UserControl>((view) =>{InitOrder();});}}#endregionpublic void InitOrder(Customer customer = null){SumMoney = 0;SumOrderCount = 0;if (customer == null){var _orders = OrderViewModel.orderProvider.GetAll().Where(t => t.OrderState == OrderState.已完成.ToString()).ToList();if (_orders != null){OrderList.Clear();foreach (var order in _orders){OrderList.Add(order);var details = OrderDetailViewModel.orderDetailProvider.GetAll().Where(t => t.OrderId == order.Id);if (details != null){order.Children.Clear();foreach (var detail in details){order.Children.Add(detail);order.SumPrice += (double)(detail.Price * detail.QuantityEx);}}SumMoney += (double)order.Children.Sum(t => t.QuantityEx * t.Price);}SumOrderCount += _orders.Count;}}else{var _orders = OrderViewModel.orderProvider.GetAll().Where(t => t.CustomerId == selectedCustomer.Id && t.OrderState == OrderState.已完成.ToString()).ToList();if (_orders != null){OrderList.Clear();foreach (var order in _orders){OrderList.Add(order);var details = OrderDetailViewModel.orderDetailProvider.GetAll().Where(t => t.OrderId == order.Id);if (details != null){order.Children.Clear();foreach (var detail in details){order.Children.Add(detail);order.SumPrice += (double)(detail.Price * detail.QuantityEx);}}SumMoney += (double)order.Children.Sum(t => t.QuantityEx * t.Price);}SumOrderCount += _orders.Count;}}}}
}

在这里插入图片描述

11. 顾客注册

  • 修改LoginView,增加注册按钮,绑定打开注册窗口命令
</StackPanel><Button x:Name="Register" Command="{Binding RegisterCommand}"CommandParameter="{Binding ElementName=loginView}" Content="注册" Width="150" Height="25" Margin="30 10 0 0"/>
</StackPanel>
public RelayCommand<LoginView> RegisterCommand
{get{//传入参数CommandParameterreturn new RelayCommand<LoginView>((view) =>{view.Hide();new SignUpView().ShowDialog();view.Show();});}
}
  • 新增SignUpView和SignUpViewModel,复用AddCustomerView和AddCustomerViewModel的界面和功能,实现如下
<Window x:Class="超市管理系统.View.SignUpView"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=SignUpViewModel}"Title="SignUpView" Height="450" Width="800"><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><StackPanel Grid.Row="1" Margin="10" HorizontalAlignment="Center" Width="500"><StackPanel Orientation="Horizontal" Height="30" Margin="0 5 0 10"><TextBlock Text="姓名:" Width="100" FontSize="18" VerticalAlignment="Center"/><TextBox Text="{Binding Customer.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="100" FontSize="18" VerticalAlignment="Center"/><TextBox Text="{Binding Customer.Password, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Width="200" Height="30" VerticalAlignment="Center"/></StackPanel><StackPanel Orientation="Horizontal" Height="30" Margin="0 5 0 10"><TextBlock Text="电话:" Width="100" FontSize="18" VerticalAlignment="Center"/><TextBox Text="{Binding Customer.Telephone, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Width="200" Height="30" VerticalAlignment="Center"/></StackPanel><StackPanel Orientation="Horizontal" Height="30" Margin="0 5 0 10"><TextBlock Text="地址:" Width="100" FontSize="18" VerticalAlignment="Center"/><TextBox Text="{Binding Customer.Address, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Width="250" Height="30" VerticalAlignment="Center"/></StackPanel></StackPanel><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>
using GalaSoft.MvvmLight.Command;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using 超市管理系统.Entity;namespace 超市管理系统.ViewModel
{public class SignUpViewModel:ViewModelBase2{private Customer customer;public Customer Customer{get { return customer; }set{customer = value;RaisePropertyChanged();}}public RelayCommand<Window> LoadedCommand{get{return new RelayCommand<Window>((view) =>{Customer = new Customer();});}}public RelayCommand<Window> AddCommand{get{return new RelayCommand<Window>((view) =>{if (string.IsNullOrEmpty(Customer.Name)){MessageBox.Show("姓名不能为空!");return;}if (string.IsNullOrEmpty(Customer.Password)){MessageBox.Show("密码不能为空!");return;}Customer.InsertDate = DateTime.Now;int count = CustomerProvider.Current.Insert(Customer);if (count > 0){MessageBox.Show("注册成功!");}view.DialogResult = true;view.Close();});}}public RelayCommand<Window> ExitCommand{get{return new RelayCommand<Window>((view) =>{view.Close();});}}}
}

在这里插入图片描述

12. 商品销售排行查询与库存提示

  • 在管理员登录的首页展示商品的销售排行榜和库存榜。
  • 销售排行榜采用datagrid控件按数量从大到小排序。库存提示榜采用listbox控件,对库存不足商品提示。
  • 界面布局设计如下:
<UserControl x:Class="超市管理系统.View.IndexView"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=IndexViewModel}"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.ColumnDefinitions><ColumnDefinition/><ColumnDefinition/></Grid.ColumnDefinitions><!--销售排行榜--><Border BorderThickness="1" BorderBrush="Gray" Grid.Column="0" Margin="10"><Grid><Grid.RowDefinitions><RowDefinition Height="30"/><RowDefinition/></Grid.RowDefinitions><Border BorderThickness="0 0 0 1" BorderBrush="Gray"><TextBlock Text="销售排行榜" VerticalAlignment="Center" HorizontalAlignment="Center" Foreground="White" FontSize="20"/></Border><DataGrid Grid.Row="1" Margin="5" Style="{StaticResource DataGridStyle}"ItemsSource="{Binding SaleList}"><DataGrid.Columns><!--数据模板写法--><DataGridTemplateColumn Width="auto" Header="商品ID"><DataGridTemplateColumn.CellTemplate><DataTemplate><Grid><TextBox Text="{Binding ProductId,Mode=OneWay, UpdateSourceTrigger=PropertyChanged}" Style="{StaticResource DataGridTextBoxStyle}"/></Grid></DataTemplate></DataGridTemplateColumn.CellTemplate></DataGridTemplateColumn><DataGridTemplateColumn Width="auto" Header="商品名称"><DataGridTemplateColumn.CellTemplate><DataTemplate><Grid><TextBox Text="{Binding ProductName, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}" Style="{StaticResource DataGridTextBoxStyle}"/></Grid></DataTemplate></DataGridTemplateColumn.CellTemplate></DataGridTemplateColumn><DataGridTemplateColumn Width="auto" Header="数量"><DataGridTemplateColumn.CellTemplate><DataTemplate><Grid><TextBox Text="{Binding Quantity, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}" Style="{StaticResource DataGridTextBoxStyle}"/></Grid></DataTemplate></DataGridTemplateColumn.CellTemplate></DataGridTemplateColumn><DataGridTemplateColumn Width="auto" Header="单位"><DataGridTemplateColumn.CellTemplate><DataTemplate><Grid><TextBox Text="{Binding Unit, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}" Style="{StaticResource DataGridTextBoxStyle}"/></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></DataGrid.Columns></DataGrid></Grid></Border><!--库存提示榜--><Border BorderThickness="1" BorderBrush="Gray" Grid.Column="1" Margin="10"><Grid><Grid.RowDefinitions><RowDefinition Height="30"/><RowDefinition/></Grid.RowDefinitions><Border BorderThickness="0 0 0 1" BorderBrush="Gray"><TextBlock Text="库存提示" VerticalAlignment="Center" HorizontalAlignment="Center" Foreground="White" FontSize="20"/></Border><ListBox Grid.Row="1" ItemsSource="{Binding ProductList}" Style="{StaticResource ListBoxStyle}" ><ListBox.ItemTemplate><DataTemplate><Border CornerRadius="5" Width="auto" Height="70" BorderThickness="1" BorderBrush="Gray" ><Border.Style><Style TargetType="Border"><Style.Triggers><Trigger Property="IsMouseOver" Value="True"><Setter Property="Background" Value="#ebeff5"/></Trigger><Trigger Property="IsMouseOver" Value="False"><Setter Property="Background" Value="White"/></Trigger></Style.Triggers></Style></Border.Style><Grid><Grid.ColumnDefinitions><ColumnDefinition Width="auto"/><ColumnDefinition Width="30"/><ColumnDefinition Width="350"/><ColumnDefinition Width="*"/></Grid.ColumnDefinitions><Border Grid.Column="0" Width="5" Background="blue"/><TextBlock Grid.Column="1" Text="&#xf05a;" FontFamily="/Fonts/#FontAwesome" FontSize="20" Foreground="red" VerticalAlignment="Center" HorizontalAlignment="Center" Margin="5"/><StackPanel Grid.Column="2"><TextBlock Text="提示" FontSize="20" FontWeight="Bold" Margin="5 10 0 0"/><TextBlock VerticalAlignment="Center" ><Run>当前</Run><Run Text="{Binding Name}" FontSize="14" Foreground="Red" /><Run Text="的库存为"/><Run Text="{Binding Quantity}" FontSize="14" Foreground="Red"/></TextBlock></StackPanel><Image Grid.Column="3" Source="{Binding BitmapImage}" Margin="5" ><Image.ToolTip><Grid><Image Source="{Binding BitmapImage}"/></Grid></Image.ToolTip></Image></Grid></Border></DataTemplate></ListBox.ItemTemplate></ListBox></Grid></Border></Grid></Grid>
</UserControl>
  • 功能代码如下:
using GalaSoft.MvvmLight.Command;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Data.SqlTypes;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Controls;
using 超市管理系统.Entity;
using 超市管理系统.Entity.Model;namespace 超市管理系统.ViewModel
{public class IndexViewModel : ViewModelBase2{//所有出库记录private List<StockRecord> stockRecordList = new List<StockRecord>();public List<StockRecord> StockRecordList{get { return stockRecordList; }set{stockRecordList = value;RaisePropertyChanged();}}//销售排行榜private ObservableCollection<StockRecord> saleList =new ObservableCollection<StockRecord>() ;public ObservableCollection<StockRecord> SaleList{get { return saleList; }set{saleList = value;RaisePropertyChanged();}}//库存提示private ObservableCollection<Product> productList = new ObservableCollection<Product>();public ObservableCollection<Product> ProductList{get { return productList; }set{productList = value;RaisePropertyChanged();}}public RelayCommand<UserControl> LoadedCommand{get{return new RelayCommand<UserControl>((view) =>{//销售排行榜StockRecordList = InstorageViewModel.stockRecordProvider.GetAll().Where(t => t.Type == StockType.出库.ToString()).ToList();var group = StockRecordList.GroupBy(t => t.ProductId);foreach (var list in group){StockRecord stock = new StockRecord();stock.Quantity = 0;foreach (var item in list){stock.ProductId = item.ProductId;stock.Type = item.Type;stock.Quantity += item.Quantity;}SaleList.Add(stock);}var tmpSaleList = SaleList.OrderByDescending(t => t.Quantity).ToList();SaleList.Clear();tmpSaleList.ForEach(t => SaleList.Add(t));//库存提示var tmpProductList = ProductViewModel.productProvider.GetAll().Where(t => t.Quantity <= 100).ToList();ProductList.Clear();tmpProductList.ForEach(t => ProductList.Add(t));});}}}
}

在这里插入图片描述

  • 其中库存提示榜设计了Border的style添加在App.xaml中。
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"><Style x:Key="ListBoxStyle" TargetType="ListBox"><Setter Property="Background" Value="Transparent"/><Setter Property="BorderBrush" Value="Transparent"/><Setter Property="ItemContainerStyle"><Setter.Value><Style TargetType="ListBoxItem"><Setter Property="Template"><Setter.Value><ControlTemplate TargetType="ListBoxItem"><ContentPresenter/></ControlTemplate></Setter.Value></Setter></Style></Setter.Value></Setter></Style>
</ResourceDictionary>

14. LiveChart报表

  • 可以采用Nuget中LiveChart.wpf创建报表。参考链接https://livecharts.dev/docs/wpf/2.0.0-rc5.4/gallery
  • 以产品月份销售数量趋势图和销售柱状图为例,展示如下:
 <!--销售走势--><wpf:CartesianChart Grid.Row="0" Grid.Column="0" Series="{Binding SeriesCollection}" Margin="5"><wpf:CartesianChart.AxisX><wpf:Axis Labels="{Binding ColumnXLabels}" Title="月度销售额统计"></wpf:Axis></wpf:CartesianChart.AxisX></wpf:CartesianChart><wpf:CartesianChart Grid.Row="0" Grid.Column="1"  Series="{Binding ColunmSeriesCollection}" Margin="5" LegendLocation="Right"><wpf:CartesianChart.AxisX><wpf:Axis Labels="{Binding ColumnXLabels}" Title="商品销售对比柱状图"></wpf:Axis></wpf:CartesianChart.AxisX><wpf:CartesianChart.AxisY><wpf:Axis></wpf:Axis></wpf:CartesianChart.AxisY></wpf:CartesianChart>
//销售走势
private SeriesCollection seriesCollection;
public SeriesCollection SeriesCollection
{get { return seriesCollection; }set{seriesCollection = value;RaisePropertyChanged();}
}private SeriesCollection colunmSeriesCollection ;
public SeriesCollection ColunmSeriesCollection
{get { return colunmSeriesCollection; }set{colunmSeriesCollection = value;RaisePropertyChanged();}
}
private List<string> columnXLabels = new List<string>();
public List<string> ColumnXLabels
{get { return columnXLabels; }set{columnXLabels = value;RaisePropertyChanged();}
}public RelayCommand<UserControl> LoadedCommand{get{return new RelayCommand<UserControl>((view) =>{//销售走势LineSeries mylineseries = new LineSeries();mylineseries.Title = "销售走势";double[] mynum = { 1, 3, 1, 6, 2, 9, 4 };mylineseries.Values = new ChartValues<double>(mynum);SeriesCollection = new SeriesCollection { mylineseries };//商品销售对比柱状图List<double> columnValues = new List<double> ();foreach (var item in SaleList){ColumnXLabels.Add(item.ProductName);columnValues.Add((double)item.Quantity);}ColumnSeries colunmseries = new ColumnSeries();colunmseries.DataLabels = true;colunmseries.Title = "";colunmseries.Values = new ChartValues<double>(columnValues);ColunmSeriesCollection = new SeriesCollection { colunmseries };});}}
}

在这里插入图片描述

总结

资源下载:https://download.csdn.net/download/lzt1027/91693079

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/93494.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/93494.shtml
英文地址,请注明出处:http://en.pswp.cn/web/93494.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Linux】文件基础IO

1.关于文件的共识原理 1.文件内容属性 2.文件分为打开的文件和没打开的文件 3.打开的文件&#xff1a; 文件被打开必须先被加载到内存&#xff0c;所以本质是研究进程和文件的关系&#xff0c;一个进程可以打开多个文件。操作系统内部一定存在大量被打开的文件&#xff0c;要进…

基于微信小程序的生态农产销售管理的设计与实现/基于C#的生态农产销售系统的设计与实现、基于asp.net的农产销售系统的设计与实现

基于微信小程序的生态农产销售管理的设计与实现/基于C#的生态农产销售系统的设计与实现、基于asp.net的农产销售系统的设计与实现

Java研学-SpringCloud(五)

一 Nacos 配置中心 1 引入依赖 – services.pom每个微服务都需要<!--配置中心--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId></dependency>2 配置文件 –…

.NET 中的延迟初始化:Lazy<T> 与LazyInitializer

标签&#xff1a;线程安全、延迟初始化、按需初始化、提升启动性能 项目地址&#xff1a;NitasDemo/12Lazy/LazyDemo at main Nita121388/NitasDemo 目录Lazy<T>1. 概念2. 基本用法 3. 异常处理 4. 线程安全模式 5. 示例1. 线程安全模式 (ExecutionAndPublication)2. 发…

【LLIE专题】LLIE低照度图像结构先验提取方法

Zero-Shot Day-Night Domain Adaptation with a Physics Prior&#xff08;ICCV,2021&#xff09;专题介绍一、研究背景二、方法1. 物理反射模型与颜色不变特征的推导&#xff08;原理推导、物理依据&#xff09;2. 颜色不变特征的计算&#xff08;特征计算公式整个过程&#x…

Font Awesome Kit 使用详解

在现代网页设计中&#xff0c;图标是提升用户体验的关键元素。而 Font Awesome 作为最受欢迎的图标库&#xff0c;其最新版本 Font Awesome 7 通过 Kit 功能提供了更便捷高效的集成方式。本文将带你全面了解如何使用 Font Awesome Kit&#xff0c;让你的网站图标管理变得轻松高…

第七十八章:AI的“智能美食家”:输出图像风格偏移的定位方法——从“滤镜病”到“大师风范”!

AI图像风格偏移前言&#xff1a;AI的“火眼金睛”——输出图像风格偏移的定位方法&#xff01;第一章&#xff1a;痛点直击——“画风跑偏”&#xff1f;AI生成艺术的“审美危机”&#xff01;第二章&#xff1a;探秘“画风密码”&#xff1a;什么是风格偏移&#xff1f;它藏在…

Android原生(Kotlin)与Flutter混合开发 - 设备控制与状态同步解决方案

Kotlin 原生实现 (Android) 1.1 AndroidManifest.xml <manifest xmlns:android"http://schemas.android.com/apk/res/android"package"com.afloia.smartconnect"><applicationandroid:name".MainApplication"android:label"Smart …

已开源:Highcharts.NET,Highcharts Android,与Highcharts iOS集成

近期了解到&#xff0c;Highcharts官方宣布将Highcharts.NET&#xff0c;Highcharts Android&#xff0c;与Highcharts iOS集成转换为开源。对于Highcharts提供世界一流的数据可视化工具&#xff0c;一直致力于将资源集中在可以为您提供最大价值的地方。官方提到&#xff1a;这…

KingbaseES:一体化架构与多层防护,支撑业务的持续稳定运行与扩展

声明&#xff1a;文章为本人真实测评博客&#xff0c;非广告 目录 引言 一、什么是KingbaseES&#xff1f; 二、KingbaseES核心特性 1. 一键迁移&#xff0c;极速性能&#xff0c;安全无忧​ 2. 性能强劲&#xff0c;扩展性强&#xff0c;助力企业应对大规模并发挑战​ …

scikit-learn/sklearn学习|广义线性回归 Logistic regression的三种成本函数

【1】引言 前序学习进程中&#xff0c;已经对线性回归和岭回归做了初步解读。 实际上&#xff0c; Logistic regression是一种广义的线性模型&#xff0c;在对线性分类的进一步学习前&#xff0c;有必要了解 Logistic regression。 【2】Logistic regression的3种成本函数 …

Tiptap(基于 Prosemirror)vs TinyMCE:哪个更适合你的技术栈?

在这之前&#xff0c;先来介绍一下 ProseMirror&#xff1a; 1. ProseMirror 是底层内核 定位&#xff1a;一个强大的 富文本编辑框架/引擎&#xff0c;不是一个成品编辑器。 作者&#xff1a;Marijn Haverbeke&#xff08;CodeMirror 作者&#xff09;。 核心思想&#xff1…

多墨智能-AI一键生成工作文档/流程图/思维导图

本文转载自&#xff1a;多墨智能-AI一键生成工作文档/流程图/思维导图 - Hello123工具导航 ** 一、AI 文档与视觉化创作助手 多墨智能是一款基于人工智能的在线工具&#xff0c;支持一键生成专业文档、流程图与思维导图&#xff0c;通过关键词输入快速完成内容创作&#xff0…

Kafka_Broker_副本基本信息

Kafka副本作用&#xff1a;提高数据可靠性 Kafka默认副本1个&#xff0c;生产环境一般配置为2个&#xff0c;保证数据可靠性&#xff0c;太多副本会增加磁盘存储空间&#xff0c;增加网络上数据传输&#xff0c;降低效率 Kafka中副本分为&#xff1a;Leader和Follower&#xff…

FreeRTOS 中的守护任务(Daemon Task)

在 FreeRTOS 中&#xff0c;守护任务&#xff08;Daemon Task&#xff09;是一个特殊的系统任务&#xff0c;主要用于管理软件定时器和其他后台操作。以下是关于 FreeRTOS 守护任务的详细信息&#xff1a; 守护任务的作用软件定时器管理&#xff1a; 当启用 configUSE_TIMERS 时…

博士招生 | 麻省理工学院 招收化学+人工智能方向 博士/博士后

内容源自“图灵学术博研社”gongzhonghao学校简介麻省理工学院&#xff08;MIT&#xff09;QS世界排名第1&#xff0c;是全球科技研究领域的顶尖学府。自成立以来&#xff0c;MIT以其卓越的科研和教育质量赢得了世界的尊敬。学校在科学、工程、经济和管理等多个领域具有深远的影…

云计算-OpenStack 实战运维:从组件配置到故障排查(含 RAID、模板、存储管理,网络、存储、镜像、容器等)

介绍 在云计算技术快速发展的背景下,OpenStack 作为开源的云计算管理平台,凭借其灵活性、可扩展性和强大的组件生态,成为构建私有云、公有云和混合云的重要选择。无论是云主机的创建与管理、存储方案的配置(如 RAID 阵列、Swift 对象存储、Cinder 块存储),还是网络编排、…

idea代码bug检测插件

代码检测工具&#xff08;插件&#xff09;推荐&#xff1a;Alibaba Java Coding Guidelines、CheckStyle、PMD、FindBugs、SonarLint。可以在idea中安装插件 让你在关注代码质量的同时&#xff0c;减少 code review 的工作量&#xff0c;提高 code review 的效率&#xff0c;…

Java String为什么要设计成不可变的?

大家好&#xff0c;我是锋哥。今天分享关于【Java String为什么要设计成不可变的?】面试题。希望对大家有帮助&#xff1b; Java String为什么要设计成不可变的? 超硬核AI学习资料&#xff0c;现在永久免费了&#xff01; Java中的String类被设计为不可变&#xff08;immut…

集成电路学习:什么是ORB方向性FAST和旋转BRIEF

ORB:方向性FAST和旋转BRIEF ORB(Oriented FAST and Rotated BRIEF)是一种在计算机视觉领域广泛应用的特征描述算法,它结合了FAST角点检测算法和BRIEF描述子算法的优点,以实现高效且具有旋转不变性的特征提取和匹配。以下是关于ORB算法的详细解析: 一、ORB算法概述 …