翼度科技»论坛 编程开发 .net 查看内容

WPF入门教程系列二十八 ——DataGrid使用示例MVVM模式(6)

7

主题

7

帖子

21

积分

新手上路

Rank: 1

积分
21
WPF入门教程系列目录WPF入门教程系列二——Application介绍WPF入门教程系列三——Application介绍(续)WPF入门教程系列四——Dispatcher介绍WPF入门教程系列五——Window 介绍
WPF入门教程系列十一——依赖属性(一)WPF入门教程系列十五——WPF中的数据绑定(一)   八、在Command中传递参数

7.上面Buttom的Command类就是纯命令,什么参数都不接收,这次的ProvinceChangedCommand类在执行命令的时候,能够传参数!采用泛型的形式,给Action添加泛型参数。
8. 在Visual Studio 2022的解决方案资源管理器中,使用鼠标右键单击“Command”文件夹,在弹出菜单中选择“添加--> 类”,在弹出的“添加新项”对话框中,选择添加 “ProvinceChangedCommand”类,这是一个我们要实现的保存操作指令,然后选择“添加”。ProvinceChangedCommand的具体代码如下:
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. using System.Windows.Input;
  7. namespace WpfGridDemo.NET7.Command
  8. {
  9.     public class ProvinceChangedCommand<T> : ICommand
  10.     {
  11.         /// <summary>
  12.         /// 命令能否执行
  13.         /// </summary>
  14.         readonly Func<bool> _canExecute;
  15.         /// <summary>
  16.         /// 命令执行的方法
  17.         /// </summary>
  18.         readonly Action<T> _execute;
  19.         /// <summary>
  20.         /// 命令的构造函数
  21.         /// </summary>
  22.         /// <param name="action">命令需执行的方法</param>
  23.         /// <param name="canExecute">命令是否可以执行的方法</param>
  24.         public ProvinceChangedCommand(Action<T> action, Func<bool> canExecute)
  25.         {
  26.             _execute = action;
  27.             _canExecute = canExecute;
  28.         }
  29.         /// <summary>
  30.         /// 判断命令是否可以执行
  31.         /// </summary>
  32.         /// <param name="parameter"></param>
  33.         /// <returns></returns>
  34.         public bool CanExecute(Object parameter)
  35.         {
  36.             if (_canExecute == null)
  37.                 return true;
  38.             return _canExecute();
  39.         }
  40.         /// <summary>
  41.         /// 执行命令
  42.         /// </summary>
  43.         /// <param name="parameter"></param>
  44.         public void Execute(Object parameter)
  45.         {
  46.             _execute((T)parameter);
  47.         }
  48.         /// <summary>
  49.         /// 事件追加、移除
  50.         /// </summary>
  51.         public event EventHandler CanExecuteChanged
  52.         {
  53.             add
  54.             {
  55.                 if (_canExecute != null)
  56.                     CommandManager.RequerySuggested += value;
  57.             }
  58.             remove
  59.             {
  60.                 if (_canExecute != null)
  61.                     CommandManager.RequerySuggested -= value;
  62.             }
  63.         }
  64.     }
  65. }
  66. void ProviceSelectionChangedExecute(object sender)
  67.         {
  68.             try
  69.             {
  70.                 if (sender is ComboBox)
  71.                 {
  72.                     ComboBox drp=sender as ComboBox;
  73.                     ProvinceCode=drp.SelectedValue.ToString();
  74.                     GridDbContext db = new GridDbContext();
  75.                     var list = db.City.AsTracking().ToList();
  76.                     List<City> citys = list.Where(x => x.ProvinceCode == ProvinceCode).ToList();
  77.                     cityList = new ObservableCollection<City>();
  78.                     if (citys != null)
  79.                     {
  80.                         citys.ForEach((t) =>
  81.                         { cityList.Add(t); }
  82.                         );
  83.                     }
  84.                     var cityCodes = from city in citys
  85.                                     select city.Code;
  86.                     List<Area> areas = db.Area.AsTracking().ToList().Where(<br>x => cityCodes.Contains(x.CityCode)).ToList();
  87.                     areaList = new ObservableCollection<Area>();
  88.                     if (areas!=null)
  89.                     {
  90.                         areas.ForEach((t) =>
  91.                         { areaList.Add(t); }
  92.                         );
  93.                     }
  94.                 }
  95.             }
  96.             catch (Exception ex)
  97.             {
  98.                 throw ex;
  99.             }
  100.         }
复制代码
结果如图:我们看到了省份下拉框中已经了省份信息。

 
9.通过绑定依赖属性,实现自动刷新需要实现以下三步:
1.Model继承并实现 INotifyPropertyChanged 接口;
2.数据集合使用ObservableCollection集合;
3.View使用Binding数据对象属性;
如果不行再看看集合在赋值前需要实例化,不然就出不来(必须要同一个源才行)
10. 在Visual Studio 2022中打开MainWindows.xmal文件,并将文件中的代码修改成如下:
  1. <Window x:Class="WpfGridDemo.NET7.MainWindow"
  2.         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  3.         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  4.         xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
  5.           xmlns:be="http://schemas.microsoft.com/xaml/behaviors"
  6.         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
  7.         xmlns:local="clr-namespace:WpfGridDemo.NET7"
  8.         mc:Ignorable="d"
  9.         Title="MainWindow" Height="600" Width="960" Loaded="Window_Loaded" >
  10.     <Grid>
  11.         <Grid.RowDefinitions>
  12.             <RowDefinition Height="100"></RowDefinition>
  13.             <RowDefinition Height="*"></RowDefinition>
  14.             <RowDefinition Height="25"></RowDefinition>
  15.         </Grid.RowDefinitions>
  16.         <WrapPanel Grid.Row="0" HorizontalAlignment="Left">
  17.             <ComboBox x:Name="cboProvince" DisplayMemberPath="Name" SelectedValuePath="Code" >
  18.                 <be:Interaction.Triggers>
  19.                     <be:EventTrigger EventName="SelectionChanged">
  20.                         <be:InvokeCommandAction Command="{Binding ProviceChangedAction}" <br>CommandParameter="{Binding  ElementName=cboProvince}"/>
  21.                     </be:EventTrigger>
  22.                 </be:Interaction.Triggers>
  23.             </ComboBox>
  24.         </WrapPanel>
  25.         <DataGrid x:Name="gridArea" Grid.Row="1" ItemsSource="{Binding GridAreaList}" <br>AutoGenerateColumns="False" HorizontalAlignment="Left" VerticalAlignment="Top" <br>SelectedItem="{Binding Path=AreaVM,
  26.                                         Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}">
  27.             <DataGrid.Columns>
  28.                 <DataGridComboBoxColumn Header="城市" Width="120" <br>ItemsSource="{Binding Path=DataContext.GridCityList, <br>RelativeSource={RelativeSource AncestorType={x:Type Window}}}"  <br>x:Name="cboCity" ClipboardContentBinding="{x:Null}"<br> SelectedValuePath="Code" SelectedValueBinding="{Binding Path=CityCode,<br>UpdateSourceTrigger=PropertyChanged}"  <br>DisplayMemberPath="Name" SelectedItemBinding="{x:Null}" />
  29.                 <DataGridTextColumn Header="县区镇" Width="*" Binding="{Binding Name}" <br>ClipboardContentBinding="{x:Null}"/>
  30.                 <DataGridTextColumn Header="邮编" Width="100"  Binding="{Binding Code}" <br>ClipboardContentBinding="{x:Null}"/>
  31.                 <DataGridTextColumn Header="创建时间" Width="160" Binding="{Binding Created}" <br>ClipboardContentBinding="{x:Null}"/>
  32.                 <DataGridTextColumn Header="更新时间" Width="160" Binding="{Binding Updated}" <br>ClipboardContentBinding="{x:Null}"/>
  33.             </DataGrid.Columns>
  34.         </DataGrid>
  35.       
  36.         <WrapPanel Grid.Row="2">
  37.         <Button  x:Name="btnRefresh"  Height="22" Width="120" Click="btnRefresh_Click">刷新</Button>
  38. <Button  x:Name="btnSave" Height="22" Width="120" Command="{Binding ClickSaveAction}" >保存</Button>
  39.         </WrapPanel>
  40.     </Grid>
  41. </Window>
复制代码
 
11. 在Visual Studio 2022中打开MainWindowsVM.cs文件,实现下拉框的选择事件的Command命令绑定,将通过Command参数传递过来的省份信息,用于数据查询,同时通知UI界面进行数据刷新。具体如下代码:
  1. using Microsoft.EntityFrameworkCore;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Collections.ObjectModel;
  5. using System.ComponentModel;
  6. using System.DirectoryServices.ActiveDirectory;
  7. using System.Linq;
  8. using System.Text;
  9. using System.Threading.Tasks;
  10. using System.Windows.Controls;
  11. using System.Windows.Input;
  12. using WpfGridDemo.NET7.Entitys;
  13. namespace WpfGridDemo.NET7.ViewModel
  14. {
  15.     public class MainWindowVM: ViewModelBase
  16.     {
  17.         public MainWindowVM() {
  18.             cityList = new ObservableCollection<City>();
  19.             areaList = new ObservableCollection<Area>();
  20.         }
  21.         private Area m_Area;
  22.         /// <summary>
  23.         /// 县镇区数据
  24.         /// </summary>
  25.         public Area AreaVM
  26.         {
  27.             get { return m_Area; }
  28.             set { m_Area = value; }
  29.         }
  30.         private string m_Province_Code;
  31.         /// <summary>
  32.         /// 省--代码
  33.         /// </summary>
  34.         public string ProvinceCode { get => m_Province_Code; set => m_Province_Code = value; }
  35.         private ObservableCollection<Area> areaList;
  36.          public ObservableCollection<Area> GridAreaList
  37.          {
  38.              get { return areaList; }
  39.              set
  40.              {
  41.                 areaList = value;
  42.                  RaisePropertyChanged("GridAreaList");
  43.              }
  44.         }
  45.         private ObservableCollection<City> cityList;
  46.         public ObservableCollection<City> GridCityList
  47.         {
  48.             get { return cityList; }
  49.             set
  50.             {
  51.                 cityList = value;
  52.                 RaisePropertyChanged("GridCityList");
  53.             }
  54.         }
  55.    
  56.         /// <summary>
  57.         /// 命令要执行的方法
  58.         /// </summary>
  59.         void SaveExecute()
  60.         {
  61.             try
  62.             {
  63.                 GridDbContext db = new GridDbContext();
  64.                 var list=db.Area.AsTracking().ToList();
  65.                 Area modifyArea = list.Where(x=>x.Id==AreaVM.Id).FirstOrDefault();
  66.                 if (modifyArea != null)
  67.                 {
  68.                     modifyArea.Name = AreaVM.Name;
  69.                     modifyArea.Updated = DateTime.Now;
  70.                     db.SaveChanges();
  71.                 }
  72.             }
  73.             catch (Exception ex)
  74.             {
  75.                 throw ex;
  76.             }
  77.         }
  78.         /// <summary>
  79.         /// 命令是否可以执行
  80.         /// </summary>
  81.         /// <returns></returns>
  82.         bool CanSaveExecute()
  83.         {
  84.             return false;
  85.         }
  86.         /// <summary>
  87.         /// 创建新命令
  88.         /// </summary>
  89.         public ICommand ClickSaveAction
  90.         {
  91.             get
  92.             {
  93.                 return new Command.SaveCommand(SaveExecute, CanSaveExecute);
  94.             }
  95.         }
  96.         //combobox
  97.         /// <summary>
  98.         /// 命令要执行的方法
  99.         /// </summary>
  100.         void ProviceSelectionChangedExecute(object sender)
  101.         {
  102.             try
  103.             {
  104.                 if (sender is ComboBox)
  105.                 {
  106.                     ComboBox drp=sender as ComboBox;
  107.                     ProvinceCode=drp.SelectedValue.ToString();
  108.                     GridDbContext db = new GridDbContext();
  109.                     var list = db.City.AsTracking().ToList();
  110.                     List<City> citys = list.Where(x => x.ProvinceCode == ProvinceCode).ToList();
  111.                     var cityCodes = from city in citys
  112.                                     select city.Code;
  113.                     List<Area> areas = db.Area.AsTracking().ToList().Where(<br>x => cityCodes.Contains(x.CityCode)).ToList();
  114.                     areaList.Clear();
  115.                     if (areas!=null)
  116.                     {
  117.                         areas.ForEach((t) =>
  118.                         { areaList.Add(t); }
  119.                         );
  120.                     }
  121.                     cityList.Clear();
  122.                     if (citys != null)
  123.                     {
  124.                         citys.ForEach((t) =>
  125.                         { cityList.Add(t); }
  126.                         );
  127.                     }
  128.                 }
  129.             }
  130.             catch (Exception ex)
  131.             {
  132.                 throw ex;
  133.             }
  134.         }
  135.         /// <summary>
  136.         /// 命令是否可以执行
  137.         /// </summary>
  138.         /// <returns></returns>
  139.         bool CanSelectionChangedExecute()
  140.         {
  141.             return true;
  142.         }
  143.         /// <summary>
  144.         /// 创建新命令
  145.         /// </summary>
  146.         public ICommand ProviceChangedAction
  147.         {
  148.             get
  149.             {
  150.                 return new Command.ProvinceChangedCommand<object>(ProviceSelectionChangedExecute,
  151. CanSelectionChangedExecute);
  152.             }
  153.         }
  154.     }
复制代码
12.在Visual Studio 2022中按F5键,启动WPF应用程序。然后使用鼠标点击省份下拉框,能够看到,界面中DataGrid中的数据,随着下拉框的变化而随之变化。如下图。
 

来源:https://www.cnblogs.com/chillsrc/archive/2023/06/18/17488927.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具