WPF+MVVM实现datagrid绑定(2)

 3、BaseViewModel

属性改变通知类,多个对象都要使用到。

namespace WPF_MVVM_Demo1.ViewModel
{
    public class BaseViewModel: INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;
        public void RaisePropertyChanged(string propertyName)
        {
            if (propertyName != null)
            {
                PropertyChanged.Invoke(this, new PropertyChangedEventArgs(propertyName));
            }
        }
    }
}

4、ViewModel类

该类真正的结合Model和View层的一个类,内容主要就在这里。

1、定义了数据源和List集合。

 

 /// <summary>
        /// 可以为数据库传过来的数据
        /// </summary>
        List<User> mylist = new List<User>();
        /// <summary>
        /// 
        /// </summary>
        ObservableCollection<User> _mylist = new ObservableCollection<User>();
       /// <summary>
       /// 绑定Datagrid的数据源
       /// </summary>
        public ObservableCollection<User> ShowList
        {
            get { return _mylist; }
            set
            {
                _mylist = value;
                RaisePropertyChanged("mylist");
            }
        }

2、事件绑定

这里是定义,后面初始化的时候,需要初始化对应的函数(方法):

 /// <summary>
        /// 添加事件绑定
        /// </summary>
        public BaseCommands AddCommand { get; set; }
        /// <summary>
        /// 修改事件绑定
        /// </summary>
        public BaseCommands UpdateCommand { get; set; }
        /// <summary>
        /// 删除事件绑定
        /// </summary>
        public BaseCommands DeleteCommand { get; set; }

3、属性绑定

属性之所以这么写是为了选择datagrid的不同行的时候,通知界面数据发生变化。

 

 public int _id;

        public int ID
        {
            get { return _id; }
            set
            {
                _id = value;
                RaisePropertyChanged("ID");
            }
        }
        public string _name;
        public string Name
        {
            get => _name;
            set
            {
                _name = value;
                RaisePropertyChanged("Name");
            }
        }
        public int _age;
        public int Age 
        { get=>_age;
            set
            {
                _age = value;
                RaisePropertyChanged("Age");
            }
        }
        public string _sex;
        public string Sex { get=> _sex; set 
            {
                _sex = value;
                RaisePropertyChanged("Sex");
            } }
        public string _remark;
        public string Remarks { get=>_remark; set
            {
                _remark = value;
                RaisePropertyChanged("Remarks");
            } }

5、构造函数

构造函数除了初始化绑定事件,另一个就是初始化数据,当然数据也可以从数据库获取,绑定到list集合即可。

  //构造函数
        public UserViewModel()
        {
            InitData();
        }
        void InitData()
        {
            AddCommand = new BaseCommands();
            AddCommand.ExecuteCommand = new Action<object>(addStudent);

            UpdateCommand = new BaseCommands();
            UpdateCommand.ExecuteCommand = new Action<object>(updateStudent);//修改方法

            DeleteCommand = new BaseCommands();
            DeleteCommand.ExecuteCommand = new Action<object>(deleteStudent);//修改方法
            //SelectCommand = new BaseCommands();
            //SelectCommand.ExecuteCommand = new Action<object>(SelectionChangedCommand);

            mylist.Add(new User() { ID = 1, Name = "张三", Age = 20, Sex = "女", Remarks = "无" });
            mylist.Add(new User() { ID = 2, Name = "李四", Age = 21, Sex = "女", Remarks = "无" });
            mylist.Add(new User() { ID = 3, Name = "王五", Age = 22, Sex = "女", Remarks = "无" });
            mylist.Add(new User() { ID = 4, Name = "赵六", Age = 24, Sex = "女", Remarks = "无" });
            Binding();
        }

6、Binding绑定

这个函数就是过滤数据之后的绑定,后续可以结合分页、带条件查询处理等都可以在这里处理。

 private void Binding()
        {
            ShowList.Clear();
            mylist.ToList().ForEach(p => ShowList.Add(p));
        }

7、添加和修改的实现

 public void addStudent(Object parameter) 
        {
            int id = mylist[mylist.Count() - 1].ID;
            mylist.Add(new User() { ID = id + 1, Name = Name, Age = Age, Sex = Sex, Remarks = Remarks });
            Binding();
        }

        public void updateStudent(object parameter)
        {
            if (ID == 0)
            {
                MessageBox.Show("请选择修改项");
                return;
            }
            foreach (var item in mylist)
            {
                if (item.ID == ID)
                {
                    item.ID = ID;
                    item.Name = Name;
                    item.Sex = Sex;
                    item.Remarks = Remarks;
                    item.Age = Age;
                    break;
                }
            }
            Binding();
        }
        public void deleteStudent(object parameter)
        {
            if (ID == 0)
            {
                MessageBox.Show("请选择删除项");
                return;
            }
            User user1 = mylist.Single(p => p.ID == ID);
            mylist.Remove(user1);
            Binding();
        }

8、dagarid的选择事件

这个即上面说的为什么定义了两个,这里用到的就是泛型类,不仅可以拿到选择的dagagird的数据,同时将数据显示在界面上。

public ICommand SelectionChangedCommand
        {
            get
            {
                return new BaseCommands<DataGrid>((datagrid) =>BtnClick(datagrid));
            }
        }
        public void BtnClick(object obj) 
        {
            DataGrid datagrid = (DataGrid)obj;
            if (datagrid.SelectedItems.Count > 0)
            {
               var  user = (User)datagrid.SelectedItems[0];
                ID = user.ID;
                Name = user.Name;
                Age = user.Age;
                Sex = user.Sex;
                Remarks = user.Remarks;
            }
        }

以上是关于ViewModel的介绍。

下一篇 

源码

  • 0
    点赞
  • 2
    评论
  • 2
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

打赏
文章很值,打赏犒劳作者一下
相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页

打赏

90e家

有C币的小伙伴可以贡献一点,哈

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者