WPF開發學生信息管理系統【WPF+Prism+MAH+WebApi】(四)

来源:https://www.cnblogs.com/hsiang/archive/2022/06/01/16336218.html
-Advertisement-
Play Games

最近通過WPF開發項目,為了對WPF知識點進行總結,所以利用業餘時間,開發一個學生信息管理系統【Student Information Management System】。前三篇文章進行了框架搭建和模塊劃分,後臺WebApi介面編寫,以及課程管理模塊開發,本文在前三篇基礎之上,繼續深入開發學生信息... ...


最近通過WPF開發項目,為了對WPF知識點進行總結,所以利用業餘時間,開發一個學生信息管理系統【Student Information Management System】。前三篇文章進行了框架搭建和模塊劃分,後臺WebApi介面編寫,以及課程管理模塊開發,本文在前三篇基礎之上,繼續深入開發學生信息管理系統的班級管理和學生管理模塊,通過本篇文章,將繼續鞏固之前的知識點,本文僅供學習分享使用,如有不足之處,還請指正。

涉及知識點

由於班級管理和學生管理的服務端開發,在第二篇文章中以後介紹,所以本篇專註介紹客戶端功能的開發。涉及知識點如下:

  1. WPF開發中TextBlock,TextBox,DataGrid,Combox等控制項的基礎使用以及數據綁定等操作。
  2. MAH樣式的使用,在本示例中MAH主要用於統一頁面風格,提高用戶體驗。
  3. HttpClient使用,主要用於訪問服務端提供的介面。

業務邏輯

首先班級管理和學生管理既有關聯,又相互獨立,不像課程管理模塊獨立存在,不與其他模塊存在依賴。所以兩個模塊一起放在一篇文章進行講解。關係如下:

  1. 學生屬於某一班級之學生,所以學生中包含班級信息。
  2. 班級中存在班長,班長又屬於學生的一個實體。

班級管理

1. 介面訪問類ClassesHttpUtil

班級數據表結構和服務介面,在第二篇文章中已有介紹,如有疑問,可前往參考。介面訪問類用於封裝訪問服務端提供的介面。如下所示:

 1 namespace SIMS.Utils.Http
 2 {
 3     public class ClassesHttpUtil:HttpUtil
 4     {
 5         /// <summary>
 6         /// 通過id查詢學生信息
 7         /// </summary>
 8         /// <param name="id"></param>
 9         /// <returns></returns>
10         public static ClassesEntity GetClasses(int id)
11         {
12             Dictionary<string, object> data = new Dictionary<string, object>();
13             data["id"] = id;
14             var str = Get(UrlConfig.CLASSES_GETCLASSES, data);
15             var classes = StrToObject<ClassesEntity>(str);
16             return classes;
17         }
18 
19         public static PagedRequest<ClassesEntity> GetClassess(string? dept, string? grade, int pageNum, int pageSize)
20         {
21             Dictionary<string, object> data = new Dictionary<string, object>();
22             data["dept"] = dept;
23             data["grade"] = grade;
24             data["pageNum"] = pageNum;
25             data["pageSize"] = pageSize;
26             var str = Get(UrlConfig.CLASSES_GETCLASSESS, data);
27             var classess = StrToObject<PagedRequest<ClassesEntity>>(str);
28             return classess;
29         }
30 
31         public static bool AddClasses(ClassesEntity classes) {
32             var ret = Post<ClassesEntity>(UrlConfig.CLASSES_ADDCLASSES, classes);
33             return int.Parse(ret)==0;
34         }
35 
36         public static bool UpdateClasses(ClassesEntity classes) {
37             var ret = Put<ClassesEntity>(UrlConfig.CLASSES_UPDATECLASSES, classes);
38             return int.Parse(ret) == 0;
39         }
40 
41         public static bool DeleteClasses(int Id)
42         {
43             Dictionary<string,  string> data = new Dictionary<string, string>();
44             data["Id"] = Id.ToString();
45             var ret = Delete(UrlConfig.CLASSES_DELETECLASSES, data);
46             return int.Parse(ret) == 0;
47         }
48     }
49 }

2. 客戶端頁面視圖

班級管理的客戶端頁面視圖共兩個,一個查詢列表頁面,一個新增編輯頁面,共同組成了班級管理的增刪改查。

查詢班級列表頁面,涉及知識點如下所示:

  1. 查詢條件或者列表中數據列展示,通過數據綁定Binding的方式與ViewModel進行交互,即點擊查詢按鈕,不再傳遞參數,因為ViewModel中的屬性已經同步更新。
  2. ViewModel中並非所有屬性都可實現雙向綁定,必須是實現具有通知功能的屬性才可以。在Prism框架中,通過BindableBase的SetProperty方法可以快速實現。
  3. View視圖中如果控制項存在Command命令,則可以直接綁定,如果不存在,則可以i:Interaction.Triggers將事件轉換為命令,如Load事件等。
  4. 在列表中,如果需要添加按鈕,可以通過DataTemplate進行數據定製。

查詢班級頁面代碼,如下所示:

  1 <UserControl x:Class="SIMS.ClassesModule.Views.Classes"
  2              xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  3              xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  4              xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
  5              xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
  6              xmlns:local="clr-namespace:SIMS.ClassesModule.Views"
  7              xmlns:prism="http://prismlibrary.com/"
  8              xmlns:i="http://schemas.microsoft.com/xaml/behaviors"
  9              xmlns:mahApps="http://metro.mahapps.com/winfx/xaml/controls"
 10              xmlns:ctrls ="clr-namespace:SIMS.Utils.Controls;assembly=SIMS.Utils"
 11              prism:ViewModelLocator.AutoWireViewModel="True"
 12              mc:Ignorable="d" 
 13              d:DesignHeight="450" d:DesignWidth="800">
 14     <UserControl.Resources>
 15         <ResourceDictionary>
 16             <ResourceDictionary.MergedDictionaries>
 17                 <ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Controls.xaml" />
 18                 <ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Themes/Light.Blue.xaml" />
 19                 <ResourceDictionary>
 20                     <Style x:Key="LinkButton" TargetType="Button">
 21                         <Setter Property="Background" Value="White"></Setter>
 22                         <Setter Property="Cursor" Value="Hand"></Setter>
 23                         <Setter Property="Margin" Value="3"></Setter>
 24                         <Setter Property="MinWidth" Value="80"></Setter>
 25                         <Setter Property="MinHeight" Value="25"></Setter>
 26                         <Setter Property="BorderThickness" Value="0 0 0 0"></Setter>
 27                     </Style>
 28                 </ResourceDictionary>
 29             </ResourceDictionary.MergedDictionaries>
 30         </ResourceDictionary>
 31     </UserControl.Resources>
 32     <i:Interaction.Triggers>
 33         <i:EventTrigger EventName="Loaded">
 34             <i:InvokeCommandAction Command="{Binding LoadedCommand}"></i:InvokeCommandAction>
 35         </i:EventTrigger>
 36     </i:Interaction.Triggers>
 37     <Grid>
 38         <Grid.RowDefinitions>
 39             <RowDefinition Height="Auto"></RowDefinition>
 40             <RowDefinition Height="Auto"></RowDefinition>
 41             <RowDefinition Height="*"></RowDefinition>
 42             <RowDefinition Height="Auto"></RowDefinition>
 43         </Grid.RowDefinitions>
 44         <TextBlock Text="班級信息" FontSize="20" Background="AliceBlue" Margin="2"></TextBlock>
 45         <StackPanel Grid.Row="1" Orientation="Horizontal" VerticalAlignment="Center">
 46             <TextBlock Text="專業" VerticalAlignment="Center" Margin="2"></TextBlock>
 47             <TextBox Margin="4" MinWidth="120" Height="30"
 48                      Text="{Binding Dept}"
 49                              HorizontalContentAlignment="Stretch"
 50                              mahApps:TextBoxHelper.ClearTextButton="True"
 51                              mahApps:TextBoxHelper.Watermark="專業"
 52                              mahApps:TextBoxHelper.WatermarkAlignment="Left"
 53                              SpellCheck.IsEnabled="True" />
 54             <TextBlock Text="年級" VerticalAlignment="Center" Margin="2"></TextBlock>
 55             <TextBox Margin="4" MinWidth="120" Height="30"
 56                      Text="{Binding Grade}"
 57                              HorizontalContentAlignment="Stretch"
 58                              mahApps:TextBoxHelper.ClearTextButton="True"
 59                              mahApps:TextBoxHelper.Watermark="年級"
 60                              mahApps:TextBoxHelper.WatermarkAlignment="Left"
 61                              SpellCheck.IsEnabled="True" />
 62             <Button Content="查詢" Style="{DynamicResource MahApps.Styles.Button.Square.Accent}" Width="120" Height="30" Margin="3" Command="{Binding QueryCommand}"></Button>
 63             <Button Content="新增" Style="{DynamicResource MahApps.Styles.Button.Square.Accent}" Width="120" Height="30" Margin="3" Command="{Binding AddCommand}"></Button>
 64         </StackPanel>
 65         <DataGrid x:Name="dgClasses"
 66                   Grid.Row="2"
 67                   Grid.Column="0"
 68                   Margin="2"
 69                   AutoGenerateColumns="False"
 70                   CanUserAddRows="False"
 71                   CanUserDeleteRows="False"
 72                   ItemsSource="{Binding Classes}"
 73                   RowHeaderWidth="0">
 74             <DataGrid.Columns>
 75                 <DataGridTextColumn Binding="{Binding Dept}" Header="專業" Width="*" />
 76                 <DataGridTextColumn Binding="{Binding Grade}" Header="年級" Width="*"/>
 77                 <DataGridTextColumn Binding="{Binding Name}" Header="班級" Width="*"/>
 78                 <DataGridTextColumn Binding="{Binding HeadTeacher}" Header="班主任" Width="*"/>
 79                 <DataGridTextColumn Binding="{Binding MonitorName}" Header="班長" Width="*" />
 80                 <DataGridTemplateColumn Header="操作" Width="*">
 81                     <DataGridTemplateColumn.CellTemplate>
 82                         <DataTemplate>
 83                             <StackPanel Orientation="Horizontal">
 84                                 <Button  Content="Edit" Style="{StaticResource LinkButton}" Command="{Binding RelativeSource={RelativeSource  AncestorType=DataGrid,  Mode=FindAncestor}, Path=DataContext.EditCommand}" CommandParameter="{Binding Id}">
 85                                     <Button.Template>
 86                                         <ControlTemplate TargetType="Button">
 87                                             <TextBlock TextDecorations="Underline" HorizontalAlignment="Center">
 88                                                 <ContentPresenter />
 89                                             </TextBlock>
 90                                         </ControlTemplate>
 91                                     </Button.Template>
 92                                 </Button>
 93                                 <Button Content="Delete" Style="{StaticResource LinkButton}" Command="{Binding RelativeSource={RelativeSource  AncestorType=DataGrid,  Mode=FindAncestor}, Path=DataContext.DeleteCommand}" CommandParameter="{Binding Id}">
 94                                     <Button.Template>
 95                                         <ControlTemplate TargetType="Button">
 96                                             <TextBlock TextDecorations="Underline" HorizontalAlignment="Center">
 97                                                 <ContentPresenter />
 98                                             </TextBlock>
 99                                         </ControlTemplate>
100                                     </Button.Template>
101                                 </Button>
102                             </StackPanel>
103                         </DataTemplate>
104                     </DataGridTemplateColumn.CellTemplate>
105                 </DataGridTemplateColumn>
106             </DataGrid.Columns>
107         </DataGrid>
108         <ctrls:PageControl Grid.Row="3" DataContext="{Binding}" ></ctrls:PageControl>
109     </Grid>
110 </UserControl>

新增編輯頁面

班級的新增功能和編輯功能,共用一個頁面,涉及知識點如下所示:

  1. 在新增編輯的ViewModel中,班級實體是一個屬性,所以在視圖控制項中進行數據綁定時,需要帶上屬性名,如:Classes.Name 。
  2. 班長列表在新增班級時尚無對應學生,可為空,待維護學生後,可通過學生列表進行選擇即可。
  3. 班長列表為Combox下拉框,綁定的是學生實體列表,但客戶端只需看到學生姓名即可,所以需要重寫DataTemplate,只顯示學生姓名。

新增班級信息視圖,具體代碼如下所示:

 1 <UserControl x:Class="SIMS.ClassesModule.Views.AddEditClasses"
 2              xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
 3              xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
 4              xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
 5              xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
 6              xmlns:local="clr-namespace:SIMS.ClassesModule.Views"
 7              mc:Ignorable="d"
 8              xmlns:i="http://schemas.microsoft.com/xaml/behaviors"
 9              xmlns:mahApps ="http://metro.mahapps.com/winfx/xaml/controls"
10              xmlns:prism="http://prismlibrary.com/"      
11              d:DesignHeight="400" d:DesignWidth="600">
12     <prism:Dialog.WindowStyle>
13         <Style TargetType="Window">
14             <Setter Property="Width" Value="600"></Setter>
15             <Setter Property="Height" Value="400"></Setter>
16         </Style>
17     </prism:Dialog.WindowStyle>
18     <UserControl.Resources>
19         <ResourceDictionary>
20             <ResourceDictionary.MergedDictionaries>
21                 <ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Controls.xaml" />
22                 <ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Themes/Light.Blue.xaml" />
23             </ResourceDictionary.MergedDictionaries>
24         </ResourceDictionary>
25     </UserControl.Resources>
26     <i:Interaction.Triggers>
27         <i:EventTrigger EventName="Loaded">
28             <i:InvokeCommandAction Command="{Binding LoadedCommand}"></i:InvokeCommandAction>
29         </i:EventTrigger>
30     </i:Interaction.Triggers>
31     <Grid>
32         <Grid.ColumnDefinitions>
33             <ColumnDefinition Width="0.2*"></ColumnDefinition>
34             <ColumnDefinition Width="Auto"></ColumnDefinition>
35             <ColumnDefinition Width="*"></ColumnDefinition>
36             <ColumnDefinition Width="0.2*"></ColumnDefinition>
37         </Grid.ColumnDefinitions>
38         <Grid.RowDefinitions>
39             <RowDefinition></RowDefinition>
40             <RowDefinition></RowDefinition>
41             <RowDefinition></RowDefinition>
              
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 目錄 一.簡介 二.效果演示 三.源碼下載 四.猜你喜歡 零基礎 OpenGL (ES) 學習路線推薦 : OpenGL (ES) 學習目錄 >> OpenGL ES 基礎 零基礎 OpenGL (ES) 學習路線推薦 : OpenGL (ES) 學習目錄 >> OpenGL ES 轉場 零基礎 O ...
  • Redis預減庫存 主要思路減少對資料庫的訪問,之前的減庫存,直接訪問資料庫,讀取庫存,當高併發請求到來的時候,大量的讀取數據有可能會導致資料庫的崩潰。 思路: 系統初始化的時候,將商品庫存載入到Redis 緩存中保存 收到請求的時候,現在Redis中拿到該商品的庫存值,進行庫存預減,如果減完之後庫 ...
  • 2018年2月28日Spring Boot進入2.0時代,距今已經超過4年了。 2022 年 11 月 Spring Boot 3.0 將正式發佈,它將基於 Spring Framework 6.0,並且需要 Java 17 或更高版本,同時它也將是Jakarta EE 9的第一個 Spring B ...
  • 快速安裝 pip install matplotlib 折線圖 快速入門 import matplotlib.pyplot as plt import random x=range(10) # 定義x軸的數據 y=[random.uniform(15,35) for i in x] # 定義y軸的數 ...
  • 一、日誌文件輸出說明 日誌目錄: /nchome/nclogs/servername/ ,其中servername集群時目錄類似為master,ncMem01等。非集群時目錄為:server1(服務名) 模塊 輸出格式 說明 anonymous anony-log.log 業務日誌,如果沒有配置模塊 ...
  • 作者:代碼的色彩 鏈接:https://juejin.cn/post/7062662600437268493 1.前言 你是否對大廠展示的五花八門,花花綠綠的架構設計圖所深深吸引,當我們想用幾張圖來介紹下業務系統,是不是對著畫布不知從何下手?作為技術扛把子的筒子們是不是需要一張圖來描述系統,讓系統各 ...
  • 概念 棧(stack)是一種運算受限的線性表。棧只能從末尾插入或刪除數據。我們把這一端稱為棧頂,對應地,把另一端稱為棧底。 隊列(queue)是一種線性表。它允許在表的某一端進行插入操作,在另一端進行刪除操作。我們把進行刪除操作的一端稱作隊列的隊尾,把進行插入操作的一端稱作隊列的隊首。 實現 註:由 ...
  • Liunx安裝Nacos 一,準備安裝包 github下載點 同時請確認Linux已安裝jdk 二,在/usr/local/目錄下創建一個文件夾用於上傳和解壓Nacos cd /usr/local/ #這裡創建文件夾名字可隨意,解壓後會生成一個名為nacos的文件夾,後續會移動至/usr/local ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...