实现了那些功能,先看看效果图:

项目工程目录:

接下来开始具体的步骤:

第一步:在VS中新建工程

第二步:使用NuGet 安装EntityFramework

第三步:使用NuGet 安装EntityFramework.SqlSreverCompact

第四步:在Entities文件夹下添加StudentEntity类

1  public class StudentEntity
2 {
3 public int StudentId { get; set; }
4 public string StudentName { get; set; }
5 public int StudentAge { get; set; }
6 public int StudentSex { get; set; }
7 public string StudentAddress { get; set; }
8
9 }

第五步:在Mappings文件夹下添加实体映射StudentEntityMapping类

 public class StudentEntityMapping : EntityTypeConfiguration<StudentEntity>
{
public StudentEntityMapping()
{
this.HasKey(t => t.StudentId); this.ToTable("Student"); this.Property(t => t.StudentId).HasColumnName("StudentId").HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity).IsRequired();
this.Property(t => t.StudentName).HasColumnName("StudentName").HasColumnType(SqlDbType.NVarChar.ToString()).HasMaxLength(50).IsRequired();
this.Property(t => t.StudentAge).HasColumnName("StudentAge").HasColumnType(SqlDbType.Int.ToString()).IsRequired();
this.Property(t => t.StudentSex).HasColumnName("StudentSex").HasColumnType(SqlDbType.Int.ToString()).IsRequired();
this.Property(t => t.StudentAddress).HasColumnName("StudentAddress").HasColumnType(SqlDbType.NVarChar.ToString()).HasMaxLength(200).IsRequired();
}
}

第六步:在Dal文件夹下添加StudentDataContext类

  public class StudentDataContext : DbContext
{ public StudentDataContext()
: base("StudentDataContext")
{ }
public DbSet<StudentEntity> Students { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Configurations.AddFromAssembly(typeof(StudentDataContext).Assembly);
}
}

第七步:在AppConfig添加数据库的连接字符串

注意此处的路径必须为绝对路径

<connectionStrings>
<add name="StudentDataContext" providerName="System.Data.SqlServerCe.4.0" connectionString="Data Source=E:\Sample\DataBase\StudentDataContext.sdf" />
</connectionStrings>

第八步:在NuGet包管理器中打开“程序包管理器控制台”

第九步:生成Migrations文件并创建数据库

A,在打开的程序包管理器控制台中输入  enable-migrations 命令此时会自动在工程目录下创建一个Migrations文件夹和Configuration.cs

B,打开Configuration.cs 修改 AutomaticMigrationsEnabled = true;

C,在打开的程序包管理器控制台中输入update-database

D,执行完成后就会在E:\Sample\DataBase\StudentDataContext.sdf下创建好数据库,将此数据库包含在项目中并将其包含在项目中,并将其设置为始终复制,编译项目,

并再次修改App.Config中的连接字符串。connectionString="Data Source=DataBase\StudentDataContext.sdf"

第十步:在Dal下添加一个用于操作数据的类StudentDal

  public  class StudentDal
{
StudentDataContext studentDataContext = new StudentDataContext(); public List<StudentEntity> GetAllStudent()
{
return studentDataContext.Students.ToList();
} public void Insert(StudentEntity studentEntity)
{
studentDataContext.Students.Add(studentEntity);
studentDataContext.SaveChanges();
}
public void Delete(StudentEntity studentEntity)
{
studentDataContext.Students.Remove(studentEntity);
studentDataContext.SaveChanges();
}
public void Update(StudentEntity studentEntity)
{
var id = studentDataContext.Students.Find(studentEntity.StudentId);
var entry = studentDataContext.Entry(id);
entry.CurrentValues.SetValues(studentEntity);
entry.Property(p => p.StudentId).IsModified = false;
studentDataContext.SaveChanges();
}
}

第十一步:在Views文件加下添加AddOrEditWindow.xaml和StudentControl.xaml

StudentControl.xaml

<UserControl x:Class="Sample.Views.StudentControl"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:viewModel="clr-namespace:Sample.ViewModels"
xmlns:convert="clr-namespace:Sample.Convert"
mc:Ignorable="d" >
<UserControl.Resources>
<Style TargetType="{x:Type DataGridColumnHeader}">
<Setter Property="HorizontalContentAlignment" Value="Center" />
<Setter Property="VerticalContentAlignment" Value="Center" />
</Style>
<convert:ConvertIntToString x:Key="convertIntToString" ></convert:ConvertIntToString>
</UserControl.Resources>
<UserControl.DataContext>
<viewModel:StudentViewModel></viewModel:StudentViewModel>
</UserControl.DataContext>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="40"></RowDefinition>
<RowDefinition Height="*"></RowDefinition>
</Grid.RowDefinitions>
<Button Width="80" Height="30" Content="添加" HorizontalAlignment="Right" Margin="0,0,20,0" Grid.Row="0" Command="{Binding AddCommand}"></Button>
<Button Width="80" Height="30" Content="刷新" HorizontalAlignment="Right" Margin="0,0,120,0" Grid.Row="0" Command="{Binding RefreshCommand}"/>
<Rectangle Fill="Black" Height="1" Grid.Row="0" VerticalAlignment="Bottom"></Rectangle>
<DataGrid Grid.Row="1" ItemsSource="{Binding Students}" SelectedItem="{Binding SelectStudentEntity, Mode=TwoWay}" CanUserSortColumns="False" CanUserResizeColumns="False" CanUserResizeRows="False" SelectionMode="Extended"
CanUserReorderColumns="False" RowHeaderWidth="0" CanUserAddRows="False" AutoGenerateColumns="False" EnableRowVirtualization="False" GridLinesVisibility="None" Margin="5" >
<DataGrid.Columns>
<DataGridTemplateColumn Header="编号" Width="80" >
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Grid>
<TextBlock Text="{Binding StudentId}" HorizontalAlignment="Center" VerticalAlignment="Center" ></TextBlock>
</Grid>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn Header="姓名" Width="120" >
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Grid>
<TextBlock Text="{Binding StudentName}" HorizontalAlignment="Center" VerticalAlignment="Center" ></TextBlock>
</Grid>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn Header="性别" Width="80" >
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Grid>
<TextBlock Text="{Binding StudentSex,Converter={StaticResource convertIntToString}}" HorizontalAlignment="Center" VerticalAlignment="Center" ></TextBlock>
</Grid>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn Header="年龄" Width="80" >
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Grid>
<TextBlock Text="{Binding StudentAge}" HorizontalAlignment="Center" VerticalAlignment="Center" ></TextBlock>
</Grid>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn Header="家庭住址" Width="180" >
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Grid>
<TextBlock Text="{Binding StudentAddress}" HorizontalAlignment="Center" VerticalAlignment="Center" ></TextBlock>
</Grid>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn Width="150" Header="操作">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Grid>
<StackPanel Orientation="Horizontal" HorizontalAlignment="Center" VerticalAlignment="Center"> <Button Width="40" Height="20" Content="编辑" FontSize="10" Command="{Binding DataContext.EditCommand, RelativeSource={RelativeSource Mode=FindAncestor,AncestorType=UserControl}}" ></Button>
<Button Width="40" Height="20" Margin="10,0,0,0" Content="删除" FontSize="10" Command="{Binding DataContext.DeleteCommand, RelativeSource={RelativeSource Mode=FindAncestor,AncestorType=UserControl}}" ></Button>
</StackPanel>
</Grid>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid> </Grid>
</UserControl>

AddOrEditWindow.xaml

 1 <Window x:Class="Sample.Views.AddOrEditWindow"
2 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
3 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
4 xmlns:viewModel="clr-namespace:Sample.ViewModels"
5 Title="AddOrEditWindow" Height="280" Width="300" WindowStartupLocation="CenterScreen" Topmost="True" ResizeMode="NoResize">
6 <Window.DataContext>
7 <viewModel:AddOrEditViewModel></viewModel:AddOrEditViewModel>
8 </Window.DataContext>
9 <Grid>
10 <Grid.RowDefinitions>
11 <RowDefinition Height="50"></RowDefinition>
12 <RowDefinition Height="50"></RowDefinition>
13 <RowDefinition Height="50"></RowDefinition>
14 <RowDefinition Height="50"></RowDefinition>
15 <RowDefinition Height="*"></RowDefinition>
16 </Grid.RowDefinitions>
17 <Grid.ColumnDefinitions>
18 <ColumnDefinition Width="100"></ColumnDefinition>
19 <ColumnDefinition Width="*"></ColumnDefinition>
20 </Grid.ColumnDefinitions>
21 <Label Grid.Row="0" Grid.Column="0" Content="学生姓名:" HorizontalAlignment="Right" VerticalAlignment="Center" Margin="0,0,10,0"></Label>
22 <Label Grid.Row="1" Grid.Column="0" Content="学生年龄:" HorizontalAlignment="Right" VerticalAlignment="Center" Margin="0,0,10,0"></Label>
23 <Label Grid.Row="2" Grid.Column="0" Content="学生性别:" HorizontalAlignment="Right" VerticalAlignment="Center" Margin="0,0,10,0"></Label>
24 <Label Grid.Row="3" Grid.Column="0" Content="家庭住址:" HorizontalAlignment="Right" VerticalAlignment="Center" Margin="0,0,10,0"></Label>
25 <TextBox Grid.Row="0" Grid.Column="1" Width="160" Height="25" Text="{Binding CurrentStudentEntity.StudentName,Mode=TwoWay}"></TextBox>
26 <TextBox Grid.Row="1" Grid.Column="1" Width="160" Height="25" Text="{Binding CurrentStudentEntity.StudentAge,Mode=TwoWay}"></TextBox>
27 <StackPanel Orientation="Horizontal" Grid.Row="2" Grid.Column="1" Margin="20,0,0,0">
28 <RadioButton GroupName="sex" Content="男" VerticalAlignment="Center" IsChecked="{Binding IsChecked,Mode=TwoWay}"></RadioButton>
29 <RadioButton GroupName="sex" Content="女" VerticalAlignment="Center" Margin="20,0,0,0"></RadioButton>
30 </StackPanel>
31 <TextBox Grid.Row="3" Grid.Column="1" Width="160" Height="25" Text="{Binding CurrentStudentEntity.StudentAddress,Mode=TwoWay}"></TextBox>
32 <Rectangle Grid.Row="3" Grid.Column="0" Grid.ColumnSpan="2" Fill="Black" Height="1" VerticalAlignment="Bottom"></Rectangle>
33 <Button Content="保存" Width="80" Height="30" Grid.Row="4" Grid.Column="1" Command="{Binding SaveCommand}"></Button>
34 </Grid>
35 </Window>

第十二步:在ViewModels中添加AddOrEditViewModel.cs和StudentViewModel.cs

StudentViewModel.cs代码:

 public class StudentViewModel : ViewModelBase
{
private List<StudentEntity> _students;
public List<StudentEntity> Students
{
get { return _students; }
set
{
if (_students != value)
{
_students = value;
this.OnPropertyChanged(r => r.Students);
}
}
} private StudentEntity _studentEntity;
public StudentEntity SelectStudentEntity
{
get { return _studentEntity; }
set
{
if (_studentEntity != value)
{
_studentEntity = value;
this.OnPropertyChanged(r => r.SelectStudentEntity);
}
}
} public ICommand AddCommand { get; set; }
public ICommand RefreshCommand { get; set; }
public ICommand EditCommand { get; set; }
public ICommand DeleteCommand { get; set; } private StudentDal studentDal = null;
public StudentViewModel()
{
studentDal = new StudentDal();
AddCommand = new DelegateCommand(AddStuddent);
RefreshCommand = new DelegateCommand(Refresh);
EditCommand = new DelegateCommand(EditStudent);
DeleteCommand = new DelegateCommand(DeleteStudent);
Students = new List<StudentEntity>();
Students = studentDal.GetAllStudent();
} private void AddStuddent()
{
AddOrEditWindow addOrEditWindow = new AddOrEditWindow();
addOrEditWindow.Show();
var addOrEditViewModel = (addOrEditWindow.DataContext as AddOrEditViewModel);
addOrEditViewModel.CurrentStudentEntity = new StudentEntity();
addOrEditViewModel.IsAdd = true;
addOrEditViewModel.StudentDal = studentDal;
} private void Refresh()
{
Students = studentDal.GetAllStudent();
}
private void EditStudent()
{
AddOrEditWindow addOrEditWindow = new AddOrEditWindow();
addOrEditWindow.Show();
var addOrEditViewModel = (addOrEditWindow.DataContext as AddOrEditViewModel);
addOrEditViewModel.CurrentStudentEntity = SelectStudentEntity;
addOrEditViewModel.IsAdd = false;
addOrEditViewModel.StudentDal = studentDal;
} private void DeleteStudent()
{
studentDal.Delete(SelectStudentEntity);
} }

AddOrEditViewModel.cs代码:

 public class AddOrEditViewModel :ViewModelBase

        private StudentEntity _currentStudentEntity;
public StudentEntity CurrentStudentEntity
{
get { return _currentStudentEntity; }
set
{
if (_currentStudentEntity != value)
{
_currentStudentEntity = value;
if (_currentStudentEntity.StudentSex == 0)
{
IsChecked = true;
}
else
{
IsChecked = false ;
} this.OnPropertyChanged(r => r.CurrentStudentEntity);
}
}
} private bool _isChecked;
public bool IsChecked
{
get { return _isChecked; }
set
{
if (_isChecked != value)
{
_isChecked = value;
this.OnPropertyChanged(r => r.IsChecked);
}
}
} public StudentDal StudentDal { get; set; } private bool _isAdd = false; public bool IsAdd
{
get { return _isAdd; }
set
{
if (_isAdd != value)
{
_isAdd = value;
this.OnPropertyChanged(r => r.IsAdd);
}
}
}
public ICommand SaveCommand { get; set; } public AddOrEditViewModel()
{
SaveCommand = new DelegateCommand(Save);
} private void Save()
{
StudentEntity student = new StudentEntity();
student.StudentName = CurrentStudentEntity.StudentName;
student.StudentAge = CurrentStudentEntity.StudentAge;
student.StudentSex = IsChecked ?0:1;
student.StudentAddress = CurrentStudentEntity.StudentAddress;
if (IsAdd)
{
StudentDal.Insert(student);
}
else
{
student.StudentId = CurrentStudentEntity.StudentId;
StudentDal.Update(student);
}
}
}

至于ViewModelBase.cs和DelegateCommand.cs这两个类可以在网上查查,这里就不贴了。

第十三步:对于性别的转换单独写了一个转化器ConvertIntToString.cs其主要功能是将数据库中的0和1转换为 “男”和“女”显示

[System.Windows.Data.ValueConversion(typeof(int), typeof(string))]
public class ConvertIntToString : System.Windows.Data.IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
string sex="";
if (int.Parse(value.ToString()) == 0)
{
sex = "男";
}
else
{
sex = "女";
}
return sex;
} public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
}

第十四步:在MainWindow.xaml中添加StudentControl控件

转自:https://i.cnblogs.com/EditPosts.aspx?opt=1

WPF+MVVM+EF示例1的更多相关文章

  1. WPF MVVM+EF增删改查 简单示例(二) 1对1 映射

    WPF MVVM+EF增删改查 简单示例(一)实现了对学生信息的管理. 现在需求发生变更,在录入学生资料的时候同时需要录入学生的图片信息,并且一名学生只能有一张图片资料.并可对学生的图片资料进行更新. ...

  2. WPF MVVM+EF 增删改查 简单示例(一)

    实现了那些功能,先看看效果图: 项目工程目录: 接下来开始具体的步骤: 第一步:在VS中新建工程 第二步:使用NuGet 安装EntityFramework 第三步:使用NuGet 安装EntityF ...

  3. C#串口调试工具 (WPF/MVVM结构完整示例版)

    前文 由于经常用到串口调试, 尽管有现成的软件, 因为前端时间涉及一个二次开发, 就因为一个RtsEnable设置, 折腾半天,  网上各种版本的也很多, 功能扩展的很开也多.所以现在自己做了一个够用 ...

  4. WPF MVVM架构 EF、WCF、IOC 设计示例经典

    概要 该演示项目利用WPF应用程序构建的MVVM架构示例, 运用了Unity容器接口注入, MVVM的经典设计, 后台利用的EF+WCF. 后台实现: 从数据库生成的emdx 结合上下文进行数据交互, ...

  5. WPF MVVM初体验

    首先MVVM设计模式的结构, Views: 由Window/Page/UserControl等构成,通过DataBinding与ViewModels建立关联: ViewModels:由一组命令,可以绑 ...

  6. WPF MVVM模式的一些理解

    /*本文转自 http://www.cnblogs.com/sirkevin/archive/2012/11/28/2793471.html */ 使用WPF+Mvvm开发一年多,期间由于对Mvvm模 ...

  7. WPF自学入门(十)WPF MVVM简单介绍

     前面文章中,我们已经知道,WPF技术的主要特点是数据驱动UI,所以在使用WPF技术开发的过程中是以数据为核心的,WPF提供了数据绑定机制,当数据发生变化时,WPF会自动发出通知去更新UI. 我们不管 ...

  8. WPF自学入门(十一)WPF MVVM模式Command命令

    在WPF自学入门(十)WPF MVVM简单介绍中的示例似乎运行起来没有什么问题,也可以进行更新.但是这并不是我们使用MVVM的正确方式.正如上一篇文章中在开始说的,MVVM的目的是为了最大限度地降低了 ...

  9. WPF MVVM从入门到精通8:数据验证

    原文:WPF MVVM从入门到精通8:数据验证 WPF MVVM从入门到精通1:MVVM模式简介 WPF MVVM从入门到精通2:实现一个登录窗口 WPF MVVM从入门到精通3:数据绑定 WPF M ...

随机推荐

  1. vue解决sass-loader的版本过高导致的编译错误

    Module build failed: TypeError: this.getResolve is not a function at Object.loader (E:\appEx\PreRese ...

  2. 人脸识别-常用的数据库Face Databases From Other Research Groups

    Static/Videos Static Single/Multiple faces Single? Gray/Color Color Resolution Vaious Face pose Fron ...

  3. hdu6393 Traffic Network in Numazu 树链剖分

    题目传送门 题意:给出n个点n条边的无向带权图,再给出两种操作,操作1是将第x条边的边权修改为y,操作2是询问点x到点y的最短路径. 思路:如果是n个点n-1条边,题目就变成了树,修改边权和询问最短路 ...

  4. Java 基础 - 基本类型和引用类型

    ref: https://www.cnblogs.com/ysocean/p/8482979.html#_label2 ------------------ 这里再给大家普及一个概念,在 Java 中 ...

  5. mac终端主机与用户名的修改

    终端中切换root用户 su - root 修改/etc/bashrc文件中的PS1='\h:\W \u$ ',其中\h代表主机名,\u代表用户名 修改完后,使用x!强制保存,即重写覆盖原有的文件. ...

  6. dos中文显示乱码怎么办?

    其实只需要一条命令 chcp 65001 执行该操作后,代码页就被变成UTF-8了 也可是GBK,  命令式:  chcp  936 2.修改窗口属性,改变字体 在命令行标题栏上点击右键,选择&quo ...

  7. 02.万恶之源-python 运算符和编码

    一.流程控制语句if: 第一种语法: (最基本的语法) if 条件: 代码块/结果1 结果2 # 如果条件是真(True)执行结果为1,然后结果为2,如果条件为错(False), 直接结果2. 第二种 ...

  8. 动态调整Log4j日志级别

    log4j2.xml配置文件中支持配置monitorInterval参数,检测到配置改变后重新加载,达到动态调整日志级别的效果. 故调整日志级别无须手动重启服务. log4j2.xml配置文件示意: ...

  9. ASP.Net调整允许上传文件的大小

    1.用户上传视频文件注意:调整允许上传文件的大小:ASP.Net为了防止过大的http恶意请求阻塞网站,所以限定了每次上传文件最大4M,asp.net1.1中把用户上传的文件先放到内存中,2.0后如果 ...

  10. 使用CEfSharp之旅(2) js前台事件执行后台方法

    原文:使用CEfSharp之旅(2) js前台事件执行后台方法 版权声明:本文为博主原创文章,未经博主允许不得转载.可点击关注博主 ,不明白的进群191065815 我的群里问 https://blo ...