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


    WPF入门教程系列五——Window 介绍

     
     
     

    八、在Command中传递参数

    7.上面Buttom的Command类就是纯命令,什么参数都不接收,这次的ProvinceChangedCommand类在执行命令的时候,能够传参数!采用泛型的形式,给Action添加泛型参数。

    8. 在Visual Studio 2022的解决方案资源管理器中,使用鼠标右键单击“Command”文件夹,在弹出菜单中选择“添加--> 类”,在弹出的“添加新项”对话框中,选择添加 “ProvinceChangedCommand”类,这是一个我们要实现的保存操作指令,然后选择“添加”。ProvinceChangedCommand的具体代码如下:

    复制代码
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    using System.Threading.Tasks;
    using System.Windows.Input;
     
    namespace WpfGridDemo.NET7.Command
    {
        public class ProvinceChangedCommand : ICommand
        {
            /// 
            /// 命令能否执行
            /// 
            readonly Func<bool> _canExecute;
            /// 
            /// 命令执行的方法
            /// 
            readonly Action _execute;
     
            /// 
            /// 命令的构造函数
            /// 
            /// 命令需执行的方法
            /// 命令是否可以执行的方法
            public ProvinceChangedCommand(Action action, Func<bool> canExecute)
            {
                _execute = action;
                _canExecute = canExecute;
            }
     
            /// 
            /// 判断命令是否可以执行
            /// 
            /// 
            /// 
            public bool CanExecute(Object parameter)
            {
                if (_canExecute == null)
                    return true;
                return _canExecute();
            }
     
            /// 
            /// 执行命令
            /// 
            /// 
            public void Execute(Object parameter)
            {
                _execute((T)parameter);
            }
     
            /// 
            /// 事件追加、移除
            /// 
            public event EventHandler CanExecuteChanged
            {
                add
                {
                    if (_canExecute != null)
                        CommandManager.RequerySuggested += value;
                }
                remove
                {
                    if (_canExecute != null)
                        CommandManager.RequerySuggested -= value;
                }
            }
     
        }
    }
    void ProviceSelectionChangedExecute(object sender)
            {
                try
                {
                    if (sender is ComboBox)
                    {
                        ComboBox drp=sender as ComboBox;
                        ProvinceCode=drp.SelectedValue.ToString();
                        GridDbContext db = new GridDbContext();
                        var list = db.City.AsTracking().ToList();
                        List citys = list.Where(x => x.ProvinceCode == ProvinceCode).ToList();
                        cityList = new ObservableCollection();
                        if (citys != null)
                        {
                            citys.ForEach((t) =>
     
                            { cityList.Add(t); }
                            );
                        }
     
                        var cityCodes = from city in citys
                                        select city.Code;
                        List areas = db.Area.AsTracking().ToList().Where(
    x => cityCodes.Contains(x.CityCode)).ToList(); areaList = new ObservableCollection(); if (areas!=null) { areas.ForEach((t) => { areaList.Add(t); } ); } } } catch (Exception ex) { throw ex; } }
    复制代码

    结果如图:我们看到了省份下拉框中已经了省份信息。

     

    9.通过绑定依赖属性,实现自动刷新需要实现以下三步:

    1.Model继承并实现 INotifyPropertyChanged 接口;

    2.数据集合使用ObservableCollection集合;

    3.View使用Binding数据对象属性;

    如果不行再看看集合在赋值前需要实例化,不然就出不来(必须要同一个源才行)

    10. 在Visual Studio 2022中打开MainWindows.xmal文件,并将文件中的代码修改成如下:

    复制代码
    <Window x:Class="WpfGridDemo.NET7.MainWindow"
            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:be="http://schemas.microsoft.com/xaml/behaviors"
            xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
            xmlns:local="clr-namespace:WpfGridDemo.NET7"
            mc:Ignorable="d"
            Title="MainWindow" Height="600" Width="960" Loaded="Window_Loaded" >
        <Grid>
            <Grid.RowDefinitions>
                <RowDefinition Height="100">RowDefinition>
                <RowDefinition Height="*">RowDefinition>
                <RowDefinition Height="25">RowDefinition>
            Grid.RowDefinitions>
            <WrapPanel Grid.Row="0" HorizontalAlignment="Left">
                <ComboBox x:Name="cboProvince" DisplayMemberPath="Name" SelectedValuePath="Code" >
     
                    <be:Interaction.Triggers>
    
                        <be:EventTrigger EventName="SelectionChanged">
                            <be:InvokeCommandAction Command="{Binding ProviceChangedAction}" 
    CommandParameter
    ="{Binding ElementName=cboProvince}"/> be:EventTrigger> be:Interaction.Triggers> ComboBox> WrapPanel> <DataGrid x:Name="gridArea" Grid.Row="1" ItemsSource="{Binding GridAreaList}"
    AutoGenerateColumns
    ="False" HorizontalAlignment="Left" VerticalAlignment="Top"
    SelectedItem
    ="{Binding Path=AreaVM, Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"> <DataGrid.Columns> <DataGridComboBoxColumn Header="城市" Width="120"
    ItemsSource
    ="{Binding Path=DataContext.GridCityList,
    RelativeSource={RelativeSource AncestorType={x:Type Window}}}
    "
    x:Name
    ="cboCity" ClipboardContentBinding="{x:Null}"
    SelectedValuePath="Code" SelectedValueBinding="{Binding Path=CityCode,
    UpdateSourceTrigger=PropertyChanged}
    "
    DisplayMemberPath
    ="Name" SelectedItemBinding="{x:Null}" /> <DataGridTextColumn Header="县区镇" Width="*" Binding="{Binding Name}"
    ClipboardContentBinding
    ="{x:Null}"/> <DataGridTextColumn Header="邮编" Width="100" Binding="{Binding Code}"
    ClipboardContentBinding
    ="{x:Null}"/> <DataGridTextColumn Header="创建时间" Width="160" Binding="{Binding Created}"
    ClipboardContentBinding
    ="{x:Null}"/> <DataGridTextColumn Header="更新时间" Width="160" Binding="{Binding Updated}"
    ClipboardContentBinding
    ="{x:Null}"/> DataGrid.Columns> DataGrid> <WrapPanel Grid.Row="2"> <Button x:Name="btnRefresh" Height="22" Width="120" Click="btnRefresh_Click">刷新Button> <Button x:Name="btnSave" Height="22" Width="120" Command="{Binding ClickSaveAction}" >保存Button> WrapPanel> Grid> Window>
    复制代码

     

    11. 在Visual Studio 2022中打开MainWindowsVM.cs文件,实现下拉框的选择事件的Command命令绑定,将通过Command参数传递过来的省份信息,用于数据查询,同时通知UI界面进行数据刷新。具体如下代码:
    复制代码
    using Microsoft.EntityFrameworkCore;
    using System;
    using System.Collections.Generic;
    using System.Collections.ObjectModel;
    using System.ComponentModel;
    using System.DirectoryServices.ActiveDirectory;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows.Controls;
    using System.Windows.Input;
    using WpfGridDemo.NET7.Entitys;
     
    namespace WpfGridDemo.NET7.ViewModel
    {
        public class MainWindowVM: ViewModelBase
        {
            public MainWindowVM() {
                cityList = new ObservableCollection();
                areaList = new ObservableCollection();
            }
            private Area m_Area;
            /// 
            /// 县镇区数据
            /// 
            public Area AreaVM
            {
                get { return m_Area; }
                set { m_Area = value; }
            }
            private string m_Province_Code;
            /// 
            /// 省--代码
            /// 
            public string ProvinceCode { get => m_Province_Code; set => m_Province_Code = value; }
            private ObservableCollection areaList;
     
             public ObservableCollection GridAreaList
             {
                 get { return areaList; }
                 set
                 {
                    areaList = value;
                     RaisePropertyChanged("GridAreaList");
                 }
            }
            private ObservableCollection cityList;
     
            public ObservableCollection GridCityList
            {
                get { return cityList; }
                set
                {
                    cityList = value;
                    RaisePropertyChanged("GridCityList");
                }
            }
        
            /// 
            /// 命令要执行的方法
            /// 
            void SaveExecute()
            {
                try
     
                {
                    GridDbContext db = new GridDbContext();
                    var list=db.Area.AsTracking().ToList();
                    Area modifyArea = list.Where(x=>x.Id==AreaVM.Id).FirstOrDefault();
                    if (modifyArea != null)
                    {
                        modifyArea.Name = AreaVM.Name;
                        modifyArea.Updated = DateTime.Now;
                        db.SaveChanges();
                    }
     
                }
                catch (Exception ex)
                {
     
                    throw ex;
                }
            }
     
            /// 
            /// 命令是否可以执行
            /// 
            /// 
            bool CanSaveExecute()
            {
                return false;
            }
     
            /// 
            /// 创建新命令
            /// 
            public ICommand ClickSaveAction
            {
                get
                {
                    return new Command.SaveCommand(SaveExecute, CanSaveExecute);
                }
            }
            //combobox
            /// 
            /// 命令要执行的方法
            /// 
            void ProviceSelectionChangedExecute(object sender)
            {
                try
     
                {
                    if (sender is ComboBox)
                    {
                        ComboBox drp=sender as ComboBox;
                        ProvinceCode=drp.SelectedValue.ToString();
                        GridDbContext db = new GridDbContext();
                        var list = db.City.AsTracking().ToList();
    
                        List citys = list.Where(x => x.ProvinceCode == ProvinceCode).ToList();
                        var cityCodes = from city in citys
                                        select city.Code;
                        List areas = db.Area.AsTracking().ToList().Where(
    x => cityCodes.Contains(x.CityCode)).ToList(); areaList.Clear(); if (areas!=null) { areas.ForEach((t) => { areaList.Add(t); } ); } cityList.Clear(); if (citys != null) { citys.ForEach((t) => { cityList.Add(t); } ); } } } catch (Exception ex) { throw ex; } } /// /// 命令是否可以执行 /// /// bool CanSelectionChangedExecute() { return true; } /// /// 创建新命令 /// public ICommand ProviceChangedAction { get { return new Command.ProvinceChangedCommand<object>(ProviceSelectionChangedExecute, CanSelectionChangedExecute); } } }
    复制代码

    12.在Visual Studio 2022中按F5键,启动WPF应用程序。然后使用鼠标点击省份下拉框,能够看到,界面中DataGrid中的数据,随着下拉框的变化而随之变化。如下图。

     

  • 相关阅读:
    硬核redis系列文章
    CentOS7.9 下修改MariaDB访问端口不能访问
    ppt 插入柱状图及基础功能调整
    Java代码规范
    react使用Material UI实现类似淘宝tab居中切换效果
    MDM数据清洗功能开发说明
    蓝桥杯入门即劝退(四)[ 字符串排序 ]
    文科生学Python:我卸载又安装过三次Anaconda | 观察
    深度学习中的激活函数
    Java学习任务总结【14】
  • 原文地址:https://www.cnblogs.com/chillsrc/p/17488927.html