WPF入門教程系列二十七 ——DataGrid使用示例MVVM模式(4)

来源:https://www.cnblogs.com/chillsrc/archive/2023/06/04/17455782.html
-Advertisement-
Play Games

# 圖片介面JWT鑒權實現 # 前言 之前做了個返回圖片鏈接的介面,然後沒做授權,然後今天鍵盤到了,也是用JWT來做介面的許可權控制。 然後JTW網上已經有很多文章來說怎麼用了,這裡就不做多的解釋了,如果不懂的可以參考下列鏈接的 文章。 圖片介面文章:[還在愁個人博客沒有圖片放?](https://w ...


WPF入門教程系列目錄 WPF入門教程系列二——Application介紹 WPF入門教程系列三——Application介紹(續) WPF入門教程系列四——Dispatcher介紹

WPF入門教程系列五——Window 介紹

WPF入門教程系列十一——依賴屬性(一) WPF入門教程系列十五——WPF中的數據綁定(一)    

    電腦界的頂極大牛們,站在金字塔尖的專家們,發明瞭模式,並大力推廣模式,其目的就是想要達到高內聚低耦合。在WPF開發中,經典的編程模式是MVVM,是為WPF量身定做的模式,該模式充分利用了WPF的數據綁定機制,最大限度地降低了Xmal文件和CS文件的耦合度,也就是UI顯示和邏輯代碼的耦合度,如需要更換界面時,邏輯代碼修改很少,甚至不用修改。與WinForm開發相比,我們一般在後臺代碼中會使用控制項的名字來操作控制項的各種屬性,進行UI更新,而在WPF中通常是通過數據綁定來更新UI;在響應用戶操作上,WinForm是通過控制項的事件來處理,而WPF可以使用命令綁定的方式來處理,耦合度將降低。

     MVVM是Model、View、ViewModel的簡寫,MVVM的根本思想就是界面和業務功能進行分離,View的職責就是負責如何顯示數據及發送命令,ViewModel的功能就是如何提供數據和執行命令。各司其職,互不影響。

       在實際的業務場景中我們經常會遇到客戶對界面提出建議要求修改,使用MVVM模式開發,當設計的界面不滿足客戶時,我們僅僅只需要對View作修改,不會影響到ViewModel中的功能代碼,減少了犯錯的機會。隨著功能地增加,系統會越來越複雜,程式會不停的增加View和ViewModel文件,這樣一來會將複雜的界面分離成局部的View,局部的View對應局部的ViewModel,各個不同的功能點可能散落在不同的ViewModel中,每個ViewModel只專註自己職能之內的事情。

        理想情況下界面和邏輯是完全分離的,單方面更改界面時不需要對邏輯代碼改動,同樣的邏輯代碼更改時也不需要更改界面。同一個ViewModel可以使用完全不用的View進行展示,同一個View也可以使用不同的ViewModel以提供不同的操作。

使用MVVM架構具有以下優勢

1、易維護

2、靈活擴展

3、易測試

4、用戶界面設計師與程式開發者能更好的合作

六、下拉框顯示省份,實現保存功能

本篇文章我們來實現按鈕的Click方法也採用綁定的形式,將業務邏輯代碼寫到業務邏輯類中,而不是寫在View的後臺cs文件中,這就需要使用Command指令。

在WPF中使用Command指令的步驟如下:

1)創建命令

2)綁定命令

3)設置命令源

4)設置命令目標

  WPF中Command指令的核心是繼承System.Windows.Input.ICommand介面,所有Command指令對象都實現了此介面。當創建自己的Command指令時,不能直接實現ICommand介面,而是要使用System.Windows.Input.RouteCommand類,該類已經實現了ICommand介面,所有WPF中的Command指令都是RouteCommand類的實例。在程式中處理的大部分Command指令不是RoutedCommand對象,而是RoutedUICommand類的實例,它繼承自RouteCommand類。

   WPF提供了一個很好的方式來解決事件綁定的問題--ICommand。很多控制項都有Command屬性,如果沒有,我們可以將Command指令綁定到觸發器上。接下來我們來先實現一個ICommand介面。ICommand需要用戶定義兩個方法bool CanExecute和void Execute。第一個方法可以讓我們來判斷是否可以執行這個命令,第二個方法就是我們具體的命令。

Command--ClickSaveAction

1. 在Visual Studio 2022的“解決方案資源管理器”中,使用滑鼠右鍵單擊“WpfGridDemo.NET7”項目,在彈出菜單中選擇“添加-->新建文件夾”。 並將“新文件夾”改名為 “Command”。

2. 在Visual Studio 2022的解決方案資源管理器中,使用滑鼠右鍵單擊“Command”文件夾,在彈出菜單中選擇“添加--> 類”,在彈出的“添加新項”對話框中,選擇添加 “SaveCommand”類,這是一個我們要實現的保存操作指令,然後選擇“添加”。

3.要實現在按鈕的Command上綁定方法,代替Click事件,就需要SaveCommand實現ICommand介面,需要我們自己創建類型去實現介面的CanExecuteExecuteCanExecuteChanged,下麵就是實現介面的代碼:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Input;

 

namespace WpfGridDemo.NET7.Command
{

    public class SaveCommand

    {

        /// <summary>
        /// 命令能否執行
        /// </summary>
        readonly Func<bool> _canExecute;

        /// <summary>
        /// 命令執行的方法
        /// </summary>
        readonly Action _execute;

 
        /// <summary>
        /// 命令的構造函數
        /// </summary>
        /// <param name="action">命令需執行的方法</param>
        /// <param name="canExecute">命令是否可以執行的方法</param>
        public SaveCommand(Action action, Func<bool> canExecute)
        {
            _execute = action;
            _canExecute = canExecute;
        }
 
        /// <summary>
        /// 判斷命令是否可以執行
        /// </summary>
        /// <param name="parameter"></param>
        /// <returns></returns>
        public bool CanExecute(Object parameter)
        {
            if (_canExecute == null)
                return true;
            return _canExecute();
        }


        /// <summary>
        /// 執行命令
        /// </summary>
        /// <param name="parameter"></param>
        public void Execute(Object parameter)

        {
            _execute();
        }
 
        /// <summary>
        /// 事件追加、移除
        /// </summary>

        public event EventHandler CanExecuteChanged
        {
            add
            {
                if (_canExecute != null)
                    CommandManager.RequerySuggested += value;
            }

            remove
            {

                if (_canExecute != null)

                    CommandManager.RequerySuggested -= value;
            }
        }
    }
}

 

4.SaveCommand類就是為了在使用命令的時候, 創建一條命令出來用於綁定,這個類型接收兩個參數,一個是命令執行的方法,另一個是有返回值的方法, 這個返回值bool用來確定,該條命令是否可以執行,如果命令不能被執行,則按鈕的IsEnabled就被會設置成不可點擊。

MainWindowVM中創建一個命令

1. 在Visual Studio 2022的“解決方案資源管理器”中,使用滑鼠右鍵單擊“WpfGridDemo.NET7”項目,在彈出菜單中選擇“添加-->新建文件夾”。 並將“新文件夾”改名為 “ViewModel”。

2. 在Visual Studio 2022的解決方案資源管理器中,使用滑鼠右鍵單擊“ViewModel”文件夾,在彈出菜單中選擇“添加--> 類”,在彈出的“添加新項”對話框中,選擇添加 “MainWindowVM”類,這是一個ViewModel,然後選擇“添加”。

3.之前我們已經創建了SaveCommand類,並實現了ICommand介面,下麵在MainWindowVM中使用SaveCommand類,創建ClickSaveAction方法。

4.由於此次我們使用的是MVVM模塊,無法直接使用界面中的控制項DataGrid的屬性,我們要將界面中所做的修改的數據保存到數據,則要在MainWindowVM添加一個綁定屬性AreaVM,用於接收界面中傳遞過來的數據。具體如下代碼:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Input;
using WpfGridDemo.NET7.Entitys;
 

namespace WpfGridDemo.NET7.ViewModel
{

    public class MainWindowVM
    {

        private Area m_Area;

        /// <summary>
        /// 員工數據
        /// </summary>
        public Area AreaVM
        {

            get { return m_Area; }

            set { m_Area = value; }
        }

        /// <summary>
        /// 命令要執行的方法
        /// </summary>
        void SaveExecute()

        {

            try 
           {
                    GridDbContext db = new GridDbContext();
                var list=db.Area.AsTracking().ToList();
                Area modifyArea = list.Where(x=>x.Id==AreaVM.Id).FirstOrDefault();

                if (modifyArea != null)
                {

                    modifyArea.Name = AreaVM.Name;
                    modifyArea.Updated = DateTime.Now;
                    db.SaveChanges();

                }
            }

            catch (Exception ex)
            {
                throw ex;
            }

        }
 
        /// <summary>
        /// 命令是否可以執行
        /// </summary>
        /// <returns></returns>
        bool CanSaveExecute()
        {
            return true;
        }

 

        /// <summary>
        /// 創建新命令
        /// </summary>

        public ICommand ClickSaveAction
        {
            get

            {
                return new Command.SaveCommand(SaveExecute, CanSaveExecute);
            }
        }
 
    }
}

註意,創建這個新的命令的名字需要和我們界面按鈕Command中綁定的名字一致,叫ClickSaveAction


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

-Advertisement-
Play Games
更多相關文章
  • # IO流原理及流的分類 ### 一、Java IO流原理 1. I/O是Input/Output的縮寫,I/O技術是非常實用的技術,用於處理數據傳輸。如讀/寫文件,網路通訊等。 2. Java程式中,對於數據的輸入/輸出操作以”流(stream)“的方式進行。 3. java.io包下提供了各種” ...
  • [模板傳送](https://www.luogu.com.cn/problem/P3369) FHQ-Treap顧名思義就是範浩強大佬設計的一種二叉平衡樹 下麵我們來講一下它的原理和代碼 # 結構體 對於一個節點,我們需要記錄的是 * 對應的值 * 子樹節點數 * 左右孩子編號 * 對應的隨機值 ` ...
  • # 文件的基本使用 ### 一、文件 - **什麼是文件** 文件是保存數據的地方,比如word文檔,txt文件,excel文件……都是文件。即可以保存一張圖片,也可以保持視頻,聲音…… - **文件流** 文件在程式中是以流的形式來操作的 ![文件流](https://img2023.cnblog ...
  • groovy 3.0.7 ### DES加密簡介 加密分為對稱加密和非對稱加密。非對稱加密,加解密使用不同的密鑰,如RSA;對稱加密,加解密使用相同的密鑰,如DES(Data Encryption Standard,即數據加密標準)。相對而言,非對稱加密安全性更高,但是計算過程複雜耗時,一般只應用於 ...
  • # 1.列表切片 前面學習的是如何處理列表的所有數據元素。python還可以處理列表的部分元素,python稱之為切片。 ## 1.1創建切片 創建切片,可指定要使用的第一個數據元素的索引和最後一個數據元素的索引。與range函數一樣,python在到達指定的第二個索引前面的數據元素後停止。比如要輸 ...
  • 本文作者從評判標準、功能評測、性能評測等多方面剖析三方庫哪些家強,並給出了比較務實的建議。 引言 為了小伙伴理解,彙總了一下文章中會提及的術語名詞解釋,請放心品讀,歡迎一起討論交流! 你真的瞭解 Go 標準庫嗎? 問題一:標準庫可以反序列化普通的字元串嗎?執行下麵的代碼會報錯嗎? var s str ...
  • 經過前幾篇文章的講解,初步瞭解ASP.NET Core MVC項目創建,啟動運行,以及命名約定,創建控制器,視圖,模型,接收參數,傳遞數據ViewData,ViewBag,路由,頁面佈局,wwwroot和客戶端庫,Razor語法,EnityFrameworkCore與資料庫,HttpContext,... ...
  • 摘要:基於.NET Core 7.0WebApi後端架構實戰【2-介入IOC控制反轉】 2023/04/09, ASP.NET Core 7.0, VS2022 引言 Inversion of Control,簡稱IOC,即控制反轉。記得當初剛實習的時候公司的帶我的人和我提到過IOC這個概念,當初完 ...
一周排行
    -Advertisement-
    Play Games
  • 概述:在C#中,++i和i++都是自增運算符,其中++i先增加值再返回,而i++先返回值再增加。應用場景根據需求選擇,首碼適合先增後用,尾碼適合先用後增。詳細示例提供清晰的代碼演示這兩者的操作時機和實際應用。 在C#中,++i 和 i++ 都是自增運算符,但它們在操作上有細微的差異,主要體現在操作的 ...
  • 上次發佈了:Taurus.MVC 性能壓力測試(ap 壓測 和 linux 下wrk 壓測):.NET Core 版本,今天計劃準備壓測一下 .NET 版本,來測試並記錄一下 Taurus.MVC 框架在 .NET 版本的性能,以便後續持續優化改進。 為了方便對比,本文章的電腦環境和測試思路,儘量和... ...
  • .NET WebAPI作為一種構建RESTful服務的強大工具,為開發者提供了便捷的方式來定義、處理HTTP請求並返迴響應。在設計API介面時,正確地接收和解析客戶端發送的數據至關重要。.NET WebAPI提供了一系列特性,如[FromRoute]、[FromQuery]和[FromBody],用 ...
  • 原因:我之所以想做這個項目,是因為在之前查找關於C#/WPF相關資料時,我發現講解圖像濾鏡的資源非常稀缺。此外,我註意到許多現有的開源庫主要基於CPU進行圖像渲染。這種方式在處理大量圖像時,會導致CPU的渲染負擔過重。因此,我將在下文中介紹如何通過GPU渲染來有效實現圖像的各種濾鏡效果。 生成的效果 ...
  • 引言 上一章我們介紹了在xUnit單元測試中用xUnit.DependencyInject來使用依賴註入,上一章我們的Sample.Repository倉儲層有一個批量註入的介面沒有做單元測試,今天用這個示例來演示一下如何用Bogus創建模擬數據 ,和 EFCore 的種子數據生成 Bogus 的優 ...
  • 一、前言 在自己的項目中,涉及到實時心率曲線的繪製,項目上的曲線繪製,一般很難找到能直接用的第三方庫,而且有些還是定製化的功能,所以還是自己繪製比較方便。很多人一聽到自己畫就害怕,感覺很難,今天就分享一個完整的實時心率數據繪製心率曲線圖的例子;之前的博客也分享給DrawingVisual繪製曲線的方 ...
  • 如果你在自定義的 Main 方法中直接使用 App 類並啟動應用程式,但發現 App.xaml 中定義的資源沒有被正確載入,那麼問題可能在於如何正確配置 App.xaml 與你的 App 類的交互。 確保 App.xaml 文件中的 x:Class 屬性正確指向你的 App 類。這樣,當你創建 Ap ...
  • 一:背景 1. 講故事 上個月有個朋友在微信上找到我,說他們的軟體在客戶那邊隔幾天就要崩潰一次,一直都沒有找到原因,讓我幫忙看下怎麼回事,確實工控類的軟體環境複雜難搞,朋友手上有一個崩潰的dump,剛好丟給我來分析一下。 二:WinDbg分析 1. 程式為什麼會崩潰 windbg 有一個厲害之處在於 ...
  • 前言 .NET生態中有許多依賴註入容器。在大多數情況下,微軟提供的內置容器在易用性和性能方面都非常優秀。外加ASP.NET Core預設使用內置容器,使用很方便。 但是筆者在使用中一直有一個頭疼的問題:服務工廠無法提供請求的服務類型相關的信息。這在一般情況下並沒有影響,但是內置容器支持註冊開放泛型服 ...
  • 一、前言 在項目開發過程中,DataGrid是經常使用到的一個數據展示控制項,而通常表格的最後一列是作為操作列存在,比如會有編輯、刪除等功能按鈕。但WPF的原始DataGrid中,預設只支持固定左側列,這跟大家習慣性操作列放最後不符,今天就來介紹一種簡單的方式實現固定右側列。(這裡的實現方式參考的大佬 ...