翼度科技»论坛 编程开发 .net 查看内容

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

6

主题

6

帖子

18

积分

新手上路

Rank: 1

积分
18
WPF入门教程系列目录WPF入门教程系列二——Application介绍WPF入门教程系列三——Application介绍(续)WPF入门教程系列四——Dispatcher介绍WPF入门教程系列五——Window 介绍
WPF入门教程系列十一——依赖属性(一)WPF入门教程系列十五——WPF中的数据绑定(一) 接上文WPF入门教程系列二十八 ——DataGrid使用示例MVVM模式(6)
    13.通过Command指令,传递了下拉框所选择的省份,datagrid自动显示相应省份的城市信息,但是以上示例中有一个Bug,就是下拉框中绑定的数据无法显示。
这是由于DataGridComboBoxColumn若要填充下拉列表,请先使用以下选项之一设置 ItemsSource 属性 ComboBox :
    1)静态资源。 使用StaticResource 标记扩展。
    2)x:Static 代码实体。 使用x:Static 标记扩展。
    3)类型的内联集合 ComboBoxItem 。
14.比较适合的绑定方式是  2)x:Static 代码实体。 使用x:Static 标记扩展需要添加相应的命名空间。在Visual Studio 2022中打开MainWindows.xmal文件,并在文件的开头添加如下命名空间。           
  1.   xmlns:v="clr-namespace:WpfGridDemo.NET7.ViewModel"
复制代码
15. 在Visual Studio 2022中打开MainWindows.xmal文件。对DataGridComboBoxColumn的ItemsSource进行了数据绑定。具体代码如下:
  1. [/code]16.在Visual Studio 2022的解决方案资源管理器中,找到[b]MainWindowVM.cs[/b][b]文件,[/b]将GridCityList属性改为静态属性,用于绑定DataGridComboBoxColumn的ItemsSource。具体如下代码:[code]        private static ObservableCollection<City> cityList;
  2.         public static ObservableCollection<City> GridCityList
  3.         {
  4.             get { return cityList; }
  5.             set
  6.             {
  7.                 cityList = value;
  8.                 new ViewModelBase().RaisePropertyChanged("GridCityList");
  9.             }
  10.         }
复制代码
17.在Visual Studio 2022中按F5键,启动WPF应用程序。然后使用鼠标点击省份下拉框,能够看到,界面中DataGrid中的数据,随着下拉框的变化而随之变化,但是城市下拉框中却没有任何数据。看来绑定失效了。如下图。 

 
 
 
 
18. 使用静态代码实体的方式,实现省市县联动失败了。又不想使用其他两种方式。在一阵猛于虎的搜索之后,发现一种实现方式。在Visual Studio 2022中打开MainWindows.xmal文件。对DataGridComboBoxColumn进行了数据绑定。具体代码如下:
  1. <DataGridComboBoxColumn Header="城市(Style)" SelectedValuePath="Code"<br> SelectedValueBinding="{Binding Path=CityCode,UpdateSourceTrigger=PropertyChanged}" <br> DisplayMemberPath="Name" SelectedItemBinding="{x:Null}"  Width="1*">
  2.                     <DataGridComboBoxColumn.EditingElementStyle>
  3.                         
  4.                     </DataGridComboBoxColumn.EditingElementStyle>
  5.                     <DataGridComboBoxColumn.ElementStyle>
  6.                        
  7.                     </DataGridComboBoxColumn.ElementStyle>
  8.                 </DataGridComboBoxColumn>
复制代码
              
19.在Visual Studio 2022的解决方案资源管理器中,找到MainWindowVM.cs文件,添加一个GridCity属性,用于绑定DataGridComboBoxColumn的ItemsSource。以下是属性代码,更完整的代码,请参见下面类的完整代码。
  1. private ObservableCollection<City> listCity;
  2.         public ObservableCollection<City> GridCity
  3.         {
  4.             get { return listCity; }
  5.             set
  6.             {
  7.                 listCity = value;
  8.                 RaisePropertyChanged("GridCity");
  9.             }
  10.         }
复制代码
20.MainWindow.xmal的全部代码如下:
  1. <DataGridComboBoxColumn Header="城市(Style)" SelectedValuePath="Code"<br> SelectedValueBinding="{Binding Path=CityCode,UpdateSourceTrigger=PropertyChanged}" <br> DisplayMemberPath="Name" SelectedItemBinding="{x:Null}"  Width="1*">
  2.                     <DataGridComboBoxColumn.EditingElementStyle>
  3.                         
  4.                     </DataGridComboBoxColumn.EditingElementStyle>
  5.                     <DataGridComboBoxColumn.ElementStyle>
  6.                        
  7.                     </DataGridComboBoxColumn.ElementStyle>
  8.                 </DataGridComboBoxColumn><DataGridComboBoxColumn Header="城市(Style)" SelectedValuePath="Code"<br> SelectedValueBinding="{Binding Path=CityCode,UpdateSourceTrigger=PropertyChanged}" <br> DisplayMemberPath="Name" SelectedItemBinding="{x:Null}"  Width="1*">
  9.                     <DataGridComboBoxColumn.EditingElementStyle>
  10.                         
  11.                     </DataGridComboBoxColumn.EditingElementStyle>
  12.                     <DataGridComboBoxColumn.ElementStyle>
  13.                        
  14.                     </DataGridComboBoxColumn.ElementStyle>
  15.                 </DataGridComboBoxColumn><DataGridComboBoxColumn Header="城市(Style)" SelectedValuePath="Code"<br> SelectedValueBinding="{Binding Path=CityCode,UpdateSourceTrigger=PropertyChanged}" <br> DisplayMemberPath="Name" SelectedItemBinding="{x:Null}"  Width="1*">
  16.                     <DataGridComboBoxColumn.EditingElementStyle>
  17.                         
  18.                     </DataGridComboBoxColumn.EditingElementStyle>
  19.                     <DataGridComboBoxColumn.ElementStyle>
  20.                        
  21.                     </DataGridComboBoxColumn.ElementStyle>
  22.                 </DataGridComboBoxColumn>                                                           刷新
  23. 保存            
复制代码
 
21. MainWindowsVM类的完整代码,如下:
  1. 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<City> cityList;
  2.         public static ObservableCollection<City> GridCityList
  3.         {
  4.             get { return cityList; }
  5.             set
  6.             {
  7.                 cityList = value;
  8.                 new ViewModelBase().RaisePropertyChanged("GridCityList");
  9.             }
  10.         }         private ObservableCollection<City> listCity;
  11.         public ObservableCollection<City> GridCity
  12.         {
  13.             get { return listCity; }
  14.             set
  15.             {
  16.                 listCity = value;
  17.                 RaisePropertyChanged("GridCity");
  18.             }
  19.         }        ///         /// 命令要执行的方法        ///         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()
  20. .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(ProviceSelectionChangedExecute
  21. , CanSelectionChangedExecute);            }        }    }}
复制代码
22.在Visual Studio 2022中按F5键,启动WPF应用程序。然后使用鼠标点击省份下拉框,能够看到,界面中DataGrid中的数据,随着下拉框的变化而随之变化,其中使用静态实体代码绑定的城市下拉框中却没有任何数据。使用使用非静态资源,在与 两个样式中绑定combobox的itemSource属性方式,效果有效。如下图。

 

来源:https://www.cnblogs.com/chillsrc/archive/2023/06/25/17502789.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具