Skip to content

服务器托管,北京服务器托管,服务器租用-价格及机房咨询

Menu
  • 首页
  • 关于我们
  • 新闻资讯
  • 数据中心
  • 服务器托管
  • 服务器租用
  • 机房租用
  • 支持中心
  • 解决方案
  • 联系我们
Menu

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

Posted on 2023年9月19日2023年9月19日 by hackdl
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 Funcbool> _canExecute;
        /// 
        /// 命令执行的方法
        /// 
        readonly Action _execute;
 
        /// 
        /// 命令的构造函数
        /// 
        /// 命令需执行的方法
        /// 命令是否可以执行的方法
        public ProvinceChangedCommand(Action action, Funcbool> 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.ProvinceChangedCommandobject
>(ProviceSelectionChangedExecute, CanSelectionChangedExecute); } } }

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

 

服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net
机房租用,北京机房租用,IDC机房托管, http://www.fwqtg.net

相关推荐: 架构师日记-从技术角度揭露电商大促备战的奥秘 | 京东云技术团队

一 背景 今年的618大促已经如期而至,接下来我会从技术的角度,跟大家聊聊大促备战的底层逻辑和实战方案,希望能够解答大家心中的一些疑惑。 首先,618大促为什么如此重要呢?先从数据的角度简单做一下分析,以下表格罗列了我们历年大促GMV成绩单: 年份 618销售…

Related posts:

  1. 香港高防免备案服务器托管
  2. 服务器托管几U选择:优选尺寸论
  3. Python 内置界面开发框架 Tkinter入门篇 丁
  4. 贵州高效稳定的L2TP服务器托管服务
  5. 天津专业托管服务:高效稳定的Win2008FTP服务器

服务器托管,北京服务器托管,服务器租用,机房机柜带宽租用

服务器托管

咨询:董先生

电话13051898268 QQ/微信93663045!

上一篇: 人才政策计算器顶层设计
下一篇: 编译安装nginx服务www.kgc.comwww.benet.com

最新更新

  • Java基本语法
  • lesson6 ZIgbee网络特性抓包分析ZIgbee网络特性抓包分析
  • Python Flask 上下文管理源码分析
  • WGS84与GCJ02、BD09经纬度坐标转换介绍
  • 使用固件库点亮LED流程

随机推荐

  • 高效稳定的东莞云服务器租赁服务
  • 高效稳定的霍尔果斯云服务器托管服务
  • 专业服务器托管管理服务全解析
  • oracle union 跟union all ,
  • 山东物理机托管服务:高效稳定的web服务器

客服咨询

  • 董先生
  • 微信/QQ:93663045
  • 电话:13051898268
  • 邮箱:dongli@hhisp.com
  • 地址:北京市石景山区重聚园甲18号2层

友情链接

  • 服务器托管
  • 机房租用托管
  • 服务器租用托管
©2023 服务器托管,北京服务器托管,服务器租用-价格及机房咨询 京ICP备13047091号-8