当前位置:网站首页>WPF之MVVM

WPF之MVVM

2022-07-06 06:54:00 zhangxiaomm

自从接触WPF后就不断听人提起MVVM。今天有空整理一下。

以前得C++(MFC)到c#的Winform都是直接编辑界面,拖控件,编辑控件的事件函数。感觉是一样的,所以我写WPF程序也是一个套路,感觉WPF并没有把UI和逻辑层分离开,和Winform区别不大,只是用Xaml语言代替了拖拽控件。

今天照着例子编写了一个整个的MVVM的程序,感受如下:

  1. mvvm的控件事件全部由命令command完成,不采用控件的click事件。
  2. 命令连接到viewmodel里,里面的命令的具体执行函数,又绑定到model里的执行函数。相当于viewmodel是一个壳子,就是把普通的具体的执行函数和view里的事件绑定起来。
  3. 这样model里的具体方法函数不用变,只需要改变viewmodel和view里的内容。

比如:model有功能函数:增删改查,界面有两个按钮,对应了两条命令,这两条命令可以对应到model里的任何一个方法函数上。或者另一个界面,有另外的按钮,也可以对应到model里的方法上,这时只需要替换view和viewmodel即可。

viewmodel层代码:

 public class MainViewModel : ViewModelBase
    {
        #region 属性和构造函数

        private LocalDb localDb;
        
        private ObservableCollection<Student> gridmodelList;
        public ObservableCollection<Student> GridmodelList
        {
            get { return gridmodelList; }
            set { gridmodelList = value; RaisePropertyChanged(); }
        }

        private string search;
        public string Search
        {
            get { return search; }
            set { search = value; RaisePropertyChanged(); }
        }
        public MainViewModel()
        {
            localDb = new LocalDb();
            QueryCommand = new RelayCommand(this.Query);
            ResetCommand = new RelayCommand(this.Reset);
            EditCommand = new RelayCommand<int>(this.Edit);
            DeleteCommand = new RelayCommand<int>(this.Delete);
            AddCommand = new RelayCommand(this.Add);
        }
        #endregion

        //命令
        public RelayCommand QueryCommand { get; set; }
        public RelayCommand ResetCommand { get; set; }
        public RelayCommand AddCommand { get; set; }
        public RelayCommand<int> EditCommand { get; set; }
        public RelayCommand<int> DeleteCommand { get; set; }

        public void Query()
        {
            List<Student> students;
            if (string.IsNullOrEmpty(search))
            {
                students = localDb.Query();
            }
            else
            {
                students = localDb.QueryByName(search);
            }

            GridmodelList = new ObservableCollection<Student>();
            if (students != null)
            {
                students.ForEach(t =>
                { GridmodelList.Add(t); });
            }
        }

        public void Reset()
        {
            this.search = string.Empty;
            this.Query();
        }

        public void Edit(int Id)
        {
            var model = localDb.QueryById(Id);
            if (model != null)
            {
                StudentWindow view = new StudentWindow(model);
                var r = view.ShowDialog();
                if (r.Value)
                {
                    var newModel = GridmodelList.FirstOrDefault(t => t.Id == model.Id);
                    if (newModel != null)
                    {
                        newModel.Name = model.Name;
                        newModel.Age = model.Age;
                        newModel.Classes = model.Classes;
                    }
                    this.Query();
                }
            }
        }

        /// <summary>
        /// 删除
        /// </summary>
        /// <param name="Id"></param>
        public void Delete(int Id)
        {
            var model = localDb.QueryById(Id);
            if (model != null)
            {
                var r = MessageBox.Show($"确定要删除吗【{model.Name}】?", "提示", MessageBoxButton.YesNo);
                if (r == MessageBoxResult.Yes)
                {
                    localDb.Remove(Id);
                    this.Query();
                }
            }
        }

        /// <summary>
        /// 新增
        /// </summary>
        public void Add()
        {
            Student model = new Student();
            StudentWindow view = new StudentWindow(model);
            var r = view.ShowDialog();
            if (r.Value)
            {
                model.Id = GridmodelList.Max(t => t.Id) + 1;
                localDb.Add(model);
                this.Query();
            }
        }
    }
}

 

原网站

版权声明
本文为[zhangxiaomm]所创,转载请带上原文链接,感谢
https://blog.csdn.net/zhangxiaomm/article/details/125442895