你的位置:首页 > ASP.net教程

[ASP.net教程]WPF MVVM+EF 增删该查 简单示例(一)


 

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

项目工程目录:

接下来开始具体的步骤:

第一步:在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"       ="http://schemas.microsoft.com/winfx/2006/xaml/presentation"       ="http://schemas.microsoft.com/winfx/2006/xaml"       ="http://schemas.open"       ="http://schemas.microsoft.com/expression/blend/2008"       ="clr-namespace:Sample.ViewModels"       ="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     "http://schemas.microsoft.com/winfx/2006/xaml/presentation" 3     "http://schemas.microsoft.com/winfx/2006/xaml" 4     "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控件

 

此文仅作学习中的记录,希望对看到此文的同学有一点点的帮助。

文中如果有不正确的地方欢迎指正。