WPF响应式mvvm数据修改,增删查改,表格操作例子

WPF_datagrid_demo2022

介绍

本项目特点以下两点:

  • 1.WPF_datagrid的增删查改,表格数据的操作
  • 2.响应式数据MVVM修改,非常酷,修改数据马上响应到页面上

源码地址

https://gitee.com/618859/wpf_datagrid_demo2022

外观

在这里插入图片描述

主要源码

具体的完整代码,看文章开头的分析哈

using GalaSoft.MvvmLight;
using GalaSoft.MvvmLight.CommandWpf;
using System.Collections.ObjectModel;
using WpfApp4DataGrid.Db;
using WpfApp4DataGrid.Models;
using WpfApp4DataGrid.views;
using System.Linq;
using System.Windows;
using System;
using System.Windows.Markup;

namespace WpfApp4DataGrid.ViewModel
{
    public class MainViewModel : ViewModelBase
    {
        public MainViewModel()
        {

            localDb = new localDb();
            QueryCommand = new RelayCommand(Query);
            cancelCommand = new RelayCommand(cancelFun);

            // 新增
            AddCommand = new RelayCommand (AddFun);
            EditCommand = new RelayCommand<int>(t => Edit(t));
            DelCommand = new RelayCommand<int>(t => Del(t));

            // 全选
            checkAllCommand = new RelayCommand<Boolean>(t => checkAll(t));

            ReadXmlCommand = new RelayCommand(ReadXml);
            this.Print(this.isAllCheck+"");
        }
        localDb localDb;

        public void Print(String data)
        {
            System.Diagnostics.Debug.WriteLine("打印" + data);
        }

        // 读取mxl
        public void ReadXml()
        {
            // 打开一个新窗口
            ReadXmlView Rview = new ReadXmlView();
            var r = Rview.ShowDialog();
        }
        // 新增
        public void AddFun()
        {
            Student model = new Student();
            model.Id = GridModelList.Count + 1;
            model.Name = "";
            if (model != null)
            {
                AddView view = new AddView(model);
                var r = view.ShowDialog();
                if (r.Value)
                {
                    localDb.AddStudentAtHead(model);
                    this.Query();
                }
            }
        }
        public void Edit(int id)
        {
            var model = localDb.GetStudentById(id);
            if (model != null)
            {
                AddView view = new AddView(model);
                var r = view.ShowDialog();
                if (r.Value)
                {
                    var newModel = GridModelList.FirstOrDefault(t => t.Id == model.Id);
                    if (newModel != null)
                    {
                        newModel.Name = model.Name;
                    }
                }
            }
        }

        public void Del(int id)
        {
            var model = localDb.GetStudentById(id);
            if (model != null)
            {
                var r = MessageBox.Show($"确认删除当前用户:{model.Name}", "操作提示",
                    MessageBoxButton.OK, MessageBoxImage.Question);
                if (r == MessageBoxResult.OK)
                {
                    localDb.DelStudent(model.Id);
                    this.Query();
                }
            }
        }

        // 全选函数
        public void checkAll(Boolean status)
        {
            System.Diagnostics.Debug.WriteLine("状态" + status);
            localDb.checkAllStudent(status);
            this.Query();
        }
        
        // 搜索框绑定值
        private string search = string.Empty;
        public string Search
        {
            get { return search; }
            set { search = value; RaisePropertyChanged(); }
        }

        // 绑定全选变量
        private Boolean isAllCheck = true;
        public Boolean IsAllCheck
        {
            get { return isAllCheck; }
            set { isAllCheck = value; RaisePropertyChanged(); }
        }

        private ObservableCollection<Student> gridModelList;

        #region
        public RelayCommand QueryCommand { get; set; }
        // 读取xml
        public RelayCommand ReadXmlCommand { get; set; }
        
        // 新增
        public RelayCommand AddCommand { get; set; }
        // 重置
        public RelayCommand cancelCommand { get; set; }

        public RelayCommand<int> EditCommand { get; set; }
        public RelayCommand<int> DelCommand { get; set; }

        // 全选
        public RelayCommand<Boolean> checkAllCommand { get; set; }



        #endregion

        public ObservableCollection<Student> GridModelList
        {
            get { return gridModelList; }
            set { gridModelList = value; RaisePropertyChanged(); }
        }

        public void Query()
        {
            var models = localDb.getStudentByName(Search);
            GridModelList = new ObservableCollection<Student>();
            if (models != null)
            {
                models.ForEach(arg =>
                {
                    GridModelList.Add(arg);
                });
            }
        }
        public void cancelFun()
        {
            this.Search = "";
            this.Query();
        }
    }
}
// 参考资料https://www.bilibili.com/video/BV1mJ411F7zG?p=9&vd_source=125d808bbbad2b8400f221b816a0f674
安装教程
  1. 项目运行环境 visual studio 2019
    2.不行的话,微信问我yizheng369
以下是一个简单的使用MVVM实现增删改查的WPF例子: Model类: ```csharp public class Person { public int Id { get; set; } public string Name { get; set; } public int Age { get; set; } } ``` ViewModel类: ```csharp public class PersonViewModel : INotifyPropertyChanged { private ObservableCollection<Person> _people; public ObservableCollection<Person> People { get { return _people; } set { if (_people != value) { _people = value; OnPropertyChanged("People"); } } } private Person _selectedPerson; public Person SelectedPerson { get { return _selectedPerson; } set { if (_selectedPerson != value) { _selectedPerson = value; OnPropertyChanged("SelectedPerson"); } } } public ICommand AddCommand { get; set; } public ICommand UpdateCommand { get; set; } public ICommand DeleteCommand { get; set; } public PersonViewModel() { // 初始化数据 People = new ObservableCollection<Person> { new Person { Id=1, Name="Tom", Age=20 }, new Person { Id=2, Name="Jerry", Age=30 }, }; // 添加命令 AddCommand = new RelayCommand(AddPerson); // 修改命令 UpdateCommand = new RelayCommand(UpdatePerson, CanUpdatePerson); // 删除命令 DeleteCommand = new RelayCommand(DeletePerson, CanDeletePerson); } private void AddPerson() { // 创建新实例 var person = new Person(); // 将新实例添加到列表中 People.Add(person); // 设置选中项为新实例 SelectedPerson = person; } private void UpdatePerson() { // 更新选中项 SelectedPerson.Name = "New Name"; SelectedPerson.Age = 25; } private bool CanUpdatePerson() { // 如果没有选中项,则不能修改 return SelectedPerson != null; } private void DeletePerson() { // 删除选中项 People.Remove(SelectedPerson); // 清空选中项 SelectedPerson = null; } private bool CanDeletePerson() { // 如果没有选中项,则不能删除 return SelectedPerson != null; } public event PropertyChangedEventHandler PropertyChanged; protected virtual void OnPropertyChanged(string propertyName) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } } ``` View: ```xml <Window x:Class="WpfApp1.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="MainWindow" Height="350" Width="525" DataContext="{StaticResource PersonViewModel}"> <Grid> <Grid.RowDefinitions> <RowDefinition Height="Auto"/> <RowDefinition Height="*"/> </Grid.RowDefinitions> <StackPanel Grid.Row="0" Orientation="Horizontal"> <Button Content="Add" Command="{Binding AddCommand}"/> <Button Content="Update" Command="{Binding UpdateCommand}"/> <Button Content="Delete" Command="{Binding DeleteCommand}"/> </StackPanel> <ListBox Grid.Row="1" ItemsSource="{Binding People}" SelectedItem="{Binding SelectedPerson}"> <ListBox.ItemTemplate> <DataTemplate> <StackPanel> <TextBlock Text="{Binding Name}"/> <TextBlock Text="{Binding Age}"/> </StackPanel> </DataTemplate> </ListBox.ItemTemplate> </ListBox> </Grid> </Window> ``` 在View中设置DataContext为ViewModel实例,并绑定AddCommand、UpdateCommand和DeleteCommand到Button的Command属性上,绑定People到ListBox的ItemsSource属性上,绑定SelectedPerson到ListBox的SelectedItem属性上。 使用RelayCommand类实现命令,该类可以在WPF中重复使用,代码如下: ```csharp public class RelayCommand : ICommand { private readonly Action _execute; private readonly Func<bool> _canExecute; public RelayCommand(Action execute) : this(execute, null) { } public RelayCommand(Action execute, Func<bool> canExecute) { _execute = execute ?? throw new ArgumentNullException(nameof(execute)); _canExecute = canExecute; } public bool CanExecute(object parameter) { return _canExecute == null || _canExecute(); } public void Execute(object parameter) { _execute(); } public event EventHandler CanExecuteChanged { add { CommandManager.RequerySuggested += value; } remove { CommandManager.RequerySuggested -= value; } } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值