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 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>
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销售…