15. 在Visual Studio 2022中打开MainWindows.xmal文件。对DataGridComboBoxColumn的ItemsSource进行了数据绑定。具体代码如下:
16.在Visual Studio 2022的解决方案资源管理器中,找到MainWindowVM.cs文件,将GridCityList属性改为静态属性,用于绑定DataGridComboBoxColumn的ItemsSource。具体如下代码:
private static ObservableCollection cityList; public static ObservableCollection GridCityList { get { return cityList; } set { cityList = value; new ViewModelBase().RaisePropertyChanged("GridCityList"); } }
17.在Visual Studio 2022中按F5键,启动WPF应用程序。然后使用鼠标点击省份下拉框,能够看到,界面中DataGrid中的数据,随着下拉框的变化而随之变化,但是城市下拉框中却没有任何数据。看来绑定失效了。如下图。
18. 使用静态代码实体的方式,实现省市县联动失败了。又不想使用其他两种方式。在一阵猛于虎的搜索之后,发现一种实现方式。在Visual Studio 2022中打开MainWindows.xmal文件。对DataGridComboBoxColumn进行了数据绑定。具体代码如下:
19.在Visual Studio 2022的解决方案资源管理器中,找到MainWindowVM.cs文件,添加一个GridCity属性,用于绑定DataGridComboBoxColumn的ItemsSource。以下是属性代码,更完整的代码,请参见下面类的完整代码。
private ObservableCollection listCity; public ObservableCollection GridCity { get { return listCity; } set { listCity = value; RaisePropertyChanged("GridCity"); } }
20.MainWindow.xmal的全部代码如下:
21. MainWindowsVM类的完整代码,如下:
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(); listCity = 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 static ObservableCollection cityList; public static ObservableCollection GridCityList { get { return cityList; } set { cityList = value; new ViewModelBase().RaisePropertyChanged("GridCityList"); } } private ObservableCollection listCity; public ObservableCollection GridCity { get { return listCity; } set { listCity = value; RaisePropertyChanged("GridCity"); } } /// /// 命令要执行的方法 /// 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); } ); } listCity.Clear(); if (citys != null) { citys.ForEach((t) => { listCity.Add(t); } ); } } } catch (Exception ex) { throw ex; } } /// /// 命令是否可以执行 /// /// bool CanSelectionChangedExecute() { return true; } /// /// 创建新命令 /// public ICommand ProviceChangedAction { get { return new Command.ProvinceChangedCommand
22.在Visual Studio 2022中按F5键,启动WPF应用程序。然后使用鼠标点击省份下拉框,能够看到,界面中DataGrid中的数据,随着下拉框的变化而随之变化,其中使用静态实体代码绑定的城市下拉框中却没有任何数据。使用使用非静态资源,在与 两个样式中绑定combobox的itemSource属性方式,效果有效。如下图。