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积分。