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

2023-06-18 12:13:17 来源:博客园
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的具体代码如下:


(资料图片)

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 _canExecute;        ///         /// 命令执行的方法        ///         readonly Action _execute;         ///         /// 命令的构造函数        ///         /// 命令需执行的方法        /// 命令是否可以执行的方法        public ProvinceChangedCommand(Action action, Func 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文件,并将文件中的代码修改成如下:

                                                                                                                                                                                                                                                                                                                                                            
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(ProviceSelectionChangedExecute, CanSelectionChangedExecute);            }        }    }

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

标签:

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

2023-06-18

印度北方邦酷暑导致34名60岁以上老人死亡

2023-06-18

当前速递!队记:森林狼可能会送走普林斯 为后续操作创造空间

2023-06-18

贵州省道真仡佬族苗族自治县发布暴雨黄色预警_头条焦点

2023-06-18

丰田的昂首阔步旅行车获得了额外的昂首阔步

2023-06-18

全球讯息:欧协联与欧联杯区别_欧联杯和欧冠的区别

2023-06-18

每日关注!春天最好看的搭配:“碎花裙+毛衣”,气质显瘦, 明星潮人都穿上了

2023-06-18

疯狂堆料无动于衷?苹果用户为何钟情iPhone? 每日速递

2023-06-18

某工场第一车间的人数比第二车间的_某工厂第一车间人数比第二车间人数的-环球观焦点

2023-06-18

北京6月第三场土拍:亦庄新城热门地块被“新面孔”南通国资摘得_环球微动态

2023-06-18

“优营商 促发展”——卧龙区七一街道召开优化营商环境工作推进会

2023-06-18

2023年甘肃高校留学生中华传统 文化体验活动在我市开展_天天热讯

2023-06-18

总恶心想吐是什么病的前兆_总恶心想吐是什么原因 全球热闻

2023-06-17

「理响中国」实现“第二个结合” 建设中国特色社会主义新文化_天天快报

2023-06-17

当前关注:贝壳海盐公寓亮相成都建设路 定义美好的租房生活

2023-06-17

新中式馒头,“妖风”四起|天天消息

2023-06-17

美团会起诉贷款吗?美团逾期要怎么和客服沟通?

2023-06-17

作为陕西双非院校的“门神”,西安理工大学有着“小清华”的美誉_天天资讯

2023-06-17

有些友情爱情只是因命中注定_对于有些友情爱情只是因命中注定简单介绍 每日观察

2023-06-17

【天天新视野】担心的事还是发生了。球场拥抱梅西,击掌大马丁的小伙,摊上事了

2023-06-17

世界热点评!图知道|高温来袭,关爱这些烈日下的守护者

2023-06-17

6月18号开始鸿运连发,好运连连,3生肖运势红红火火|天天速讯

2023-06-17

范小振_关于范小振的简介

2023-06-17

Dynabook发布仅重904g的轻薄Portégé X30L-K笔记本

2023-06-17

继续称霸!夺取欧冠后,曼城今夏必要大动作,3亿镑奖金锁定强援

2023-06-17

【世界快播报】江苏联通客服电话_江苏联通网上营业厅

2023-06-17

七挡双离合怎么驾驶 全球今热点

2023-06-17

网易公开课为什么只能看标清 网易公开课调画质的方法_速看料

2023-06-17

5月CPI止步“三连降” 世界热议

2023-06-17

海尔智家:所有的磨砺,都为用户绽放 全球时快讯

2023-06-17

Copyright ©  2015-2023 华夏频道网版权所有  备案号:琼ICP备2022009675号-37   联系邮箱:435 227 67@qq.com