WPF MVVM+EF 增刪該查 簡單示例(一)

来源:http://www.cnblogs.com/qindongshou/archive/2016/04/01/5345471.html
-Advertisement-
Play Games

實現了那些功能,先看看效果圖: 項目工程目錄: 接下來開始具體的步驟: 第一步:在VS中新建工程 第二步:使用NuGet 安裝EntityFramework 第三步:使用NuGet 安裝EntityFramework.SqlSreverCompact 第四步:在Entities文件夾下添加Stude ...


 

實現了那些功能,先看看效果圖:

項目工程目錄:

接下來開始具體的步驟:

第一步:在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控制項

 

此文僅作學習中的記錄,希望對看到此文的同學有一點點的幫助。

文中如果有不正確的地方歡迎指正。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 本文略微有些長,花了好幾晚時間編輯修改,若在措辭排版上有問題,請諒解。本文共分為四篇,下麵是主要內容,也是軟體開發基本流程。 階段 描述 需求分析 主要描述實現本程式的目的及對需求進行分析,即為什麼要花時間來編寫,需要哪些功能等; 方案設計 根據現有的需求,設計出一個可行的方案(即使可能還存在某些問 ...
  • 演算法實例 排序演算法Sort 快速排序QuickSort bing搜索結果 "http://www.bing.com/knows/search?q=%E5%BF%AB%E9%80%9F%E6%8E%92%E5%BA%8F%E7%AE%97%E6%B3%95&mkt=zh cn&FORM=BKACAI" ...
  • 事件是一種用於類和類之間傳遞消息或觸發新的行為的編程方式。通過提供事件的句柄,能夠把控制項和可執行的代碼聯繫在一起, 如用戶單擊Button控制項觸發Click事件後就執行相應的事件處理代碼。 事件的聲明通過委托來實現。先定義委托,再用委托定義事件,觸發事件的過程實質是調用委托。事件聲明語法格式如下: ...
  • 一、開發環境 系統:win10 編譯器:VS2013 二、涉及程式集 Spring.Core.dll 1.3.1 Common.Logging.dll 三、開發過程 1.項目結構 2.編寫Mobile.cs namespace SpringNetMethodDi { public abstract ... ...
  • 具體事例說明: 函數 一般定義形式 : 修飾符 返回值類型 函數名(輸入參數1,參數2,……) { 函數體} 例如:函數的定義 函數的使用 ...
  • Mybatis 相關http://www.mybatis.org/mybatis-3/zh/getting-started.html ...
  • 算術運算符+ - * / % ++ -- 舉例:1. while (true) { Console.Write("請輸入整數a:"); int a = int.Parse(Console.ReadLine()); Console.Write("請輸入整數b:"); int b = int.Parse ...
  • html代碼: hub代碼: 通知調用Notify方法即可。 關鍵點:GlobalHost.ConnectionManager.GetHubContext ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...