wpf入门必备mvvm范例,用mvvmlight做的增删改查demo

13 篇文章 1 订阅

        wpf的精华就是mvvm,viewmodel与view以及db.cs数据库操作类的关系,使得mianwondow几乎不用写什么代码,逻辑都放在viewmodel里,db里存放一些基础数据操作方法。

先展示一下界面:

主界面 

新增以及修改界面

先展示一下解决方案,如下图,db文件夹下存放的mydb.cs是数据库基本操作,model下的student.cs是实体类,view文件夹下是视图(界面)文件,viewmodel文件夹下的mianviewmodel.cs是vm文件(关键文件),开始撸代码之前,先要去nuget上下载mvvmlight包。

首先是mainwindow.xaml页面  

<Window x:Class="WpfApp9.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfApp9"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Grid >
        <Grid.RowDefinitions >
            <RowDefinition Height="50"></RowDefinition>
            <RowDefinition ></RowDefinition>
        </Grid.RowDefinitions>
        <StackPanel  Orientation="Horizontal" Height=" 20"  Grid.Row="0" VerticalAlignment="Top" Margin=" 0 20 0 0">
            <TextBlock  Text="搜索条件:"></TextBlock>
            <TextBox  Width="200"  Text="{Binding Search}" ></TextBox>
            <Button Content="搜索" Width=" 50" Margin=" 20 0 0 0 " Command="{Binding SearchCommand }"></Button>
            <Button Content="重置" Width=" 50" Margin=" 20 0 0 0 " Command="{Binding ResetSearchCommand }"></Button>
            <Button Content="新增" Width=" 50" Margin=" 20 0 0 0 " Command="{Binding AddCommand }"></Button>
        </StackPanel>
        <DataGrid  Grid.Row="1" ColumnWidth="*" AutoGenerateColumns="False" CanUserAddRows="False"  ItemsSource="{Binding GridModelList}">
            <DataGrid.Columns >
                <DataGridTextColumn Header="序号" Binding="{Binding Id}"></DataGridTextColumn>
                <DataGridTextColumn Header="姓名" Binding="{Binding Name}"></DataGridTextColumn>
                <DataGridTextColumn Header="性别" Binding="{Binding Sex}"></DataGridTextColumn>
                <DataGridTextColumn Header="年龄" Binding="{Binding Age}"></DataGridTextColumn>
                <DataGridTemplateColumn Header="操作">
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <StackPanel  Orientation="Horizontal">
                                <Button  Content="编辑" Margin="10  0 0 0" 
                                         CommandParameter="{Binding Id}" 
                                         Command="{Binding DataContext.EditCommand ,RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=DataGrid}}">
                                </Button>
                                <Button  Content="删除" Margin="10  0 0 0" 
                                         CommandParameter="{Binding Id}" 
                                         Command="{Binding DataContext.DelCommand ,RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=DataGrid}}">
                                </Button>

                            </StackPanel>
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                </DataGridTemplateColumn>
            </DataGrid.Columns>
        </DataGrid>
    </Grid>
</Window>

接着是编辑和新增页面:

<Window x:Class="WpfApp9.View.UserView"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfApp9.View"
        mc:Ignorable="d" 
        WindowStyle="None"
        WindowStartupLocation="CenterScreen"
        Title="UserView" Height="300" Width="400">
    <Grid >
        <Grid.RowDefinitions>
            <RowDefinition Height=" 50"></RowDefinition>
            <RowDefinition  ></RowDefinition>
            <RowDefinition Height=" 50"></RowDefinition>
        </Grid.RowDefinitions>
        <StackPanel >
            <TextBlock Text="编辑用户信息"></TextBlock>
        </StackPanel>
        <StackPanel Grid.Row="1">
            <StackPanel  Orientation="Horizontal">
                <TextBlock Text="姓名:"></TextBlock>
                <TextBox Width="200" Text="{Binding Model.Name}"></TextBox>
            </StackPanel>
            <StackPanel Orientation="Horizontal"  Margin="0 20 0 0 ">
                <TextBlock Text="年龄:"></TextBlock>
                <TextBox Width="200" Text="{Binding Model.Age}"></TextBox>
            </StackPanel>
            
        </StackPanel>
        <StackPanel Grid.Row="2" Orientation="Horizontal" HorizontalAlignment="Right"  Margin="0 0 10 0">
            <Button  Content="确定" Width="80" Height="30" Margin="20 0 0 0" Click="btn_Confirm"></Button>
            <Button  Content="取消" Width="80" Height="30" Margin="20 0 0 0" Click="btn_Cancel"></Button>
        </StackPanel>
    </Grid>
</Window>

然后是数据库操作类 db.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using WpfApp9.Model;

namespace WpfApp9.Db
{
    class MyDb
    {   
        private List<Student> stList;
        public MyDb()
        {
            init();
        }

        private void init()
        {
            stList = new List<Student>();
            for (int i = 1; i < 31; i++)
            {
                stList.Add(new Student()
                {
                    Id = i,Name="张三"+i,Age=i*10,Sex=i%2==0?"男":"女"
                }) ;
            }
        }
        public List<Student> GetStudents() 
        {
            return stList;
        }

        public void addStudents(Student stu)
        {
            stList.Add(stu);
        }
        public void delStudents(int id)
        {
            //stList.RemoveAt
            Student model = stList.FirstOrDefault(t => t.Id == id);
            if (model != null)
            {
                stList.Remove(model);
            }
        }
        public List<Student> getStudentByName(string name)
        {  
              return stList.Where(t => t.Name.Contains(name)).ToList ();
        }

        public Student   getStudentById(int id)
        {
            //return stList.FirstOrDefault(t => t.Id == id);
             
            var model = stList.FirstOrDefault(t => t.Id == id);
            if (model == null) return null;
            Student newmodel = new Student() { Id= model.Id, Name=model.Name,Age=model.Age };
            return newmodel;

        }

    }
    
}

接着是实体类student.cs

using GalaSoft.MvvmLight;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace WpfApp9.Model
{
   public  class Student : ViewModelBase
    {
        private int id;
        public int Id
        {
            get { return id; }
            set
            {
                id = value;
                RaisePropertyChanged("Id");
            }
        }

        private string name;
        public string Name
        {
            get { return name; }
            set
            {
                name = value;
                RaisePropertyChanged("Name");
            }
        }
        private string  sex;
        public string Sex
        {
            get { return sex; }
            set
            {
                sex = value;
                RaisePropertyChanged("Sex");
            }
        }


        private int age;
        public int Age
        {
            get { return age; }
            set
            {
                age = value;
                RaisePropertyChanged("Age");
            }
        }

    }
}

然后是mainviewmodel.cs

using GalaSoft.MvvmLight;
using GalaSoft.MvvmLight.Command;
using System;
using System.Collections.ObjectModel;
using WpfApp9.Db;
using WpfApp9.Model;
using System.Linq;
using System.Windows;

namespace WpfApp9.ViewModel
{
    /// <summary>
    /// This class contains properties that the main View can data bind to.
    /// <para>
    /// Use the <strong>mvvminpc</strong> snippet to add bindable properties to this ViewModel.
    /// </para>
    /// <para>
    /// You can also use Blend to data bind with the tool's support.
    /// </para>
    /// <para>
    /// See http://www.galasoft.ch/mvvm
    /// </para>
    /// </summary>
    public class MainViewModel : ViewModelBase
    {
        MyDb mb;
        private string search = "";
        public string Search
        {
            get { return search; }
            set
            {
                search = value;
                RaisePropertyChanged("Search");
            }
        }
        /// <summary>
        /// Initializes a new instance of the MainViewModel class.
        /// </summary>
        public MainViewModel()
        {
            mb = new MyDb();

            SearchCommand = new RelayCommand(query);
            ResetSearchCommand = new RelayCommand(() =>
            {
                Search = "";
                query();
            });
            EditCommand = new RelayCommand<int>(t => edit(t));
            DelCommand = new RelayCommand<int>(t => del(t));
            AddCommand = new RelayCommand(add);
        }
        private ObservableCollection<Student> gridModelList;
        public ObservableCollection<Student> GridModelList
        {
            get
            {
                return gridModelList;
            }
            set
            {
                gridModelList = value;
                RaisePropertyChanged("GridModelList");
            }
        }

        public RelayCommand SearchCommand { get; set; }
        public RelayCommand ResetSearchCommand { get; set; }
        public RelayCommand<int> EditCommand { get; set; }
        public RelayCommand<int> DelCommand { get; set; }
        public RelayCommand AddCommand { get; set; }
        public void query()
        {
            GridModelList = new ObservableCollection<Student>();
            var model = mb.getStudentByName(Search);
            if (model == null) return;
            foreach (var item in model)
            {
                GridModelList.Add(item);
            }
        }

        public void edit(int id)
        {
            Student model = mb.getStudentById(id);
            if (model != null)
            {
                View.UserView uv = new View.UserView(model);
                //uv.ShowDialog();
                //if(uv.DialogResult==true)
                if (uv.ShowDialog()== true)//获取弹窗的结果(简写)
                {
                    var newModel = GridModelList.FirstOrDefault(t => t.Id == model.Id);
                    if (newModel != null)
                    {
                        newModel.Name = model.Name;
                        newModel.Age = model.Age;
                    }
                }
            }
        }
        public void del(int id)
        {
            Student model = mb.getStudentById(id);
            if (model != null)
            {
                var v = MessageBox.Show($"确认删除当前用户{model.Name}?", "确认删除", MessageBoxButton.OK, MessageBoxImage.Question);
                if (v == MessageBoxResult.OK)
                {
                    mb.delStudents(model.Id);
                    this.query();
                }
            }
        }

        public void add()
        {
            Student model = new Student();
            View.UserView uv = new View.UserView(model);
            if (uv.ShowDialog() == true)//获取弹窗的结果(简写)
            {
                model.Id = GridModelList.Max(t => t.Id) + 1;
                mb.addStudents(model);
                this.query();
            }
        }


    }

}

最后,是mainwoindow.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using WpfApp9.ViewModel;

namespace WpfApp9
{
    /// <summary>
    /// MainWindow.xaml 的交互逻辑
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            MainViewModel mvd = new MainViewModel();
            mvd.query();
            this.DataContext = mvd;
        }
    }
}

最后献上源文件下载路径,只需要5积分。

mvvmlightdemo.zip-.Net文档类资源-CSDN下载

  • 0
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
WPF(Windows Presentation Foundation)是一个用于创建 Windows 应用程序的开发框架。MVVM(Model-View-ViewModel)是一种设计模式,用于将应用程序的业务逻辑与用户界面进行分离。 在WPF中,可以使用MVVM模式来实现增删改查功能。以下是实现增删改查的基本步骤: 1. Model(模型):模型层表示应用程序的数据源,例如从数据库或其他数据存储中检索和保存数据。可以创建一个类来定义模型,其中包含要操作的属性和方法。 2. View(视图):视图层表示用户界面,用于显示和接收用户操作。可以在XAML文件中创建视图,其中包含用户界面元素,例如按钮、文本框和数据表格。 3. ViewModel(视图模型):视图模型是模型和视图之间的中间层,用于处理业务逻辑。可以创建一个类来定义视图模型,其中包含与用户界面交互的命令和属性。视图模型还可以包含对模型的引用,用于执行增删改查操作。 4. 数据绑定:使用数据绑定将视图和视图模型连接起来。可以将视图模型的属性绑定到视图的控件,以便在用户界面上显示数据。还可以将视图模型的命令绑定到视图的按钮,以便在用户界面上触发操作。 5. 实现增删改查功能:在视图模型中编写逻辑代码,以实现增删改查功能。通过调用模型的方法,可以在数据库中执行相应的操作。然后,更新视图模型中的属性,以便在用户界面上反映出变化的数据。 通过以上步骤,就可以在WPF中实现增删改查功能。MVVM模式的好处是可以将应用程序的不同功能进行清晰的分离,提高代码的可维护性和可测试性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值