WPF【11_4】WPF實戰-重構與美化(MVVM 架構)

11-9 【理論】MVVM 架構

在 WPF 項目中,我們主要采用的是一種類似 MVC 的架構,叫做 MVVM。 MVVM 繼承了 MVC 的理念,是 Model-View-ViewModel 的縮寫,中文意思是模型、視圖、視圖模型。這三個詞分開看我們都能看懂,不過合在一起是什么意思呢?

既然合在一起看不懂,咱們還是分開來解釋吧。

什么是MVVM示例圖

? ? 首先, View。?
? ? 當我們創建一個新的 WPF 項目的時候,首先打開的是什么呢?是這個界面設計頁面, MainWindow.xaml 文件,沒錯吧?那這個 xaml 是干什么用的呢?它就是用來與 UI, 與用戶界面打交道的文件。在這個文件中,所有的設計元素、 UI 組件、代碼全部都可以看作視圖(View)。
? ? 所以說我們的視圖不僅包含 UI 界面,還包含了這個界面中所涉及的代碼邏輯。因此在 WPF 項目中, xaml 文件件以及 xaml.cs 文件,都可以被我們稱作視圖。在一個視圖中,我們可以創建文本框、 TextBox、 DatePicker、 Button 等等各種各樣的組件。而支撐這個視圖的數據則來自數據模型(Model)。?
? ? 比如說我們的 WPF 項目有兩個部分的數據,客戶的姓名以及預約數據。而這些數據分別對應的也正是我們數據庫中的兩張表。所有的數據定型和結構化處理都是由這個模型來完成的。在視圖中,我們可以根據模型的字段來顯示和更新數據。比如說客戶模型,我們需要包含他的姓名、身份證、住址等等信息。而預約模型應該包含客戶的 ID、 預約時間等等。
? ? 雖然對于一個 WPF 項目來說,僅僅使用 Model 和 View, 甚至只使用 View 也能完成各種各樣復雜的功能,比如說上一章我們的實戰項目只有 View, 同樣也可以完成客戶預約系統的開發。但是直接從視圖訪問數據庫是一種比較低級的開發方式,我們無法對數據進行隔離,無法進行復雜的業務開發,甚至無法可持續的維護系統。
? ? 所以我們必須要進行業務與數據的隔離,以及業務與界面的隔離。根據上述的原則,對于業務進行分離后,我們就得到了視圖模型。客戶視圖模型對應的就是客戶模型。視圖模型可以全部或者部分使用模型的字段。模型的字段通過映射的方式向視圖模型提供數據支持。而視圖模型與視圖則是雙向綁定,不僅可以讓用戶看到數據,還可以通過 UI 交互操作數據。
? ? 而視圖模型作為業務邏輯的載體,也會承擔與數據庫的溝通工作。
? ? 比如說, UI 上面有兩個按鈕,分別是刷新客戶信息和保存客戶信息。點擊刷新, UI 則會通過發送事件的方式通知視圖模型,而視圖模型在收到刷新請求以后,就會去數據庫提取數據,然后重新把數據提供給視圖。如果用戶點擊了保存信息的按鈕,那么視圖模型同樣會接收到更新事件,然后會把 UI 上用戶輸入的數據提交給數據庫,完成數據的更新。而最后我們的視圖模型則會處理一切與 UI 的交互行為。

什么是MVVM示例圖2

? ? 所以簡單來說, MVVM 架構就是由視圖、模型以及視圖模型構成。視圖模型訪問數據庫提取數據,通過使用模型來對象化數據,然后把數據綁定給 UI,也就是視圖。而視圖則處理一切與用戶的交互,并且把用戶數據反饋給視圖模型,由視圖模型的業務規則來提供下一步的處理。最后,視圖與模型之間由于加入了視圖模型,所以產生了系統的分層,而數據也得到了有效的隔離,它們之間則是一個間接引用的關系。

那么 MVVM 架構有什么優點呢?
? ·兼容MVC架構
? ·方便測試
? ·方便維護

第一,我們之前說過 MVVM是一種脫胎于 MVC 的架構,可以說是 MVC 的升級。所以 MVC 架構的項目可以非常輕松移植到 MVVM。?
第二,在 MVVM 里面, Controller 不再與 Model 進行綁定了,而通過 ViewModel 使用 Model 進行數據的對象化處理,所以業務與 UI 邏輯徹底分開,減輕了測試壓力。如果有 iOS 開發經歷,就會感覺到自從 Xcode 7 開始。 iOS 的測試變得越來越完善了。
第三,因為業務、 UI 數據全部獨立,所以不管是未來的維護還是系統升級都是非常舒服的。


當然, MVVM 也不是萬金油,它也有缺點。
? ·代碼量增加
? ·對象調用復雜度增加

比如說使用它,代碼量會有明顯的增加,這一點在接下來的課程中就會看到。而且對象的調用也會比較復雜,…… 不用太擔心!


?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/83119.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/83119.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/83119.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

使用PowerBI個人網關定時刷新數據

使用PowerBI個人網關定時刷新數據 PowerBI desktop連接mysql,可以設置定時刷新數據或在PowerBI服務中手動刷新數據,步驟如下: 第一步: 下載網關。以個人網關為例,如圖 第二步: 雙擊網關,點擊下一步&…

深度學習驅動的超高清圖修復技術——綜述

Deep Learning-Driven Ultra-High-Definition Image Restoration: A Survey Liyan Wang, Weixiang Zhou, Cong Wang, Kin-Man Lam, Zhixun Su, Jinshan Pan Abstract Ultra-high-definition (UHD) image restoration?? aims to specifically solve the problem of ??quali…

3 分鐘學會使用 Puppeteer 將 HTML 轉 PDF

需求背景 1、網頁存檔與文檔管理 需要將網頁內容長期保存或歸檔為PDF,確保內容不被篡改或丟失,適用于法律文檔、合同、技術文檔等場景。PDF格式便于存儲和檢索。 2、電子報告生成 動態生成的HTML內容(如數據分析報告、儀表盤)需導出為PDF供下載或打印。PDF保留排版和樣…

電子郵箱設置SSL:構建郵件傳輸的加密護城河

在數字化通信高度依賴的今天,電子郵件作為企業協作與個人隱私的核心載體,其安全性直接關系到數據主權與商業利益。SSL(Secure Sockets Layer)作為網絡通信加密的基石技術,通過為郵件傳輸建立加密隧道,有效抵…

Qt -使用OpenCV得到SDF

博客主頁:【夜泉_ly】 本文專欄:【暫無】 歡迎點贊👍收藏?關注?? 目錄 cv::MatdistanceTransform獲得SDF 本文的目標, 是簡單學習并使用OpenCV的相關函數, 并獲得QImage的SDF(Signed Distance Field 有向距離場) 至…

Compose仿微信底部導航欄NavigationBar :底部導航控制滑動并移動

文章目錄 1、準備工作1.1 參考1.2 依賴添加:1.3 主要控件NavigationBarHorizontalPager、VerticalPager 2、功能描述:3、實現過程3.1 創建一個數據類3.2 創建一個list變量3.3 具體實現3.3.1 創建共享的Pager狀態3.3.2 將頁面索引與頁面標題同步3.3.3 創建…

WindowServer2022下docker方式安裝dify步驟

WindowServer2022下docker方式安裝dify步驟(穩定后考慮部署至linux中) 教程:https://blog.csdn.net/qq_49035156/article/details/143264534 0、資源要求 ---windows:8核CPU、16G內存、200G500G存儲 ---10.21.31.122/administra…

【數據治理】要點整理-信息技術數據質量評價指標-GB/T36344-2018

導讀:指標為數據質量評估提供了一套系統化、標準化的框架,涵蓋規范性、完整性、準確性、一致性、時效性、可訪問性六大核心指標,助力組織提升數據處理效率、支持決策制定及業務流程優化,確保數據在數據生存周期各階段的質量可控。…

前端實現圖片壓縮:基于 HTML5 File API 與 Canvas 的完整方案

在 Web 開發中,處理用戶上傳的圖片時,前端壓縮可以有效減少服務器壓力并提升上傳效率。本文將詳細講解如何通過<input type="file">實現圖片上傳,結合 Canvas 實現圖片壓縮,并實時展示壓縮前后的圖片預覽和文件大小對比。 一、核心功能架構 我們將實現以…

通信算法之280:無人機偵測模塊知識框架思維導圖

1. 無人機偵測模塊知識框架思維導圖, 見文末章節。 2. OFDM參數估計,基于循環自相關特性。 3. 無人機其它參數估計

單片機寄存器的四種主要類型!

1. 控制寄存器&#xff08;Control Registers&#xff09;?? ??專業定義??&#xff1a;用于配置硬件行為或觸發操作的寄存器。 ??大白話??&#xff1a; 相當于設備的??“控制面板”??&#xff0c;通過寫入特定值來??開關功能??或??調整參數??。例如&am…

第100+41步 ChatGPT學習:R語言實現誤判病例分析

本期是《第33步 機器學習分類實戰&#xff1a;誤判病例分析》的R版本。 嘗試使用Deepseek-R1來試試寫代碼&#xff0c;效果還不錯。 下面上R語言代碼&#xff0c;以Xgboost為例&#xff1a; # 加載必要的庫 library(caret) library(pROC) library(ggplot2) library(xgboost)…

HTML Day04

Day04 0.引言1. HTML字符實體2. HTML表單2.1 表單標簽2.2 表單示例 3. HTML框架4. HTML顏色4.1 16進制表示法4.2 rgba表示法4.3 名稱表達法 5. HTML腳本 0.引言 剛剛回顧了前面幾篇博客&#xff0c;感覺寫的內容倒是很詳細&#xff0c;每個知識點都做了說明。但是感覺在知識組織…

comfyui 工作流中 視頻長度和哪些參數有關? 生成15秒的視頻,再加上RTX4060 8G顯卡,嘗試一下

想再消費級顯卡上生成15秒長視頻&#xff0c;還是比較慢的&#xff0c;不過動漫的畫質要求比較低 在ComfyUI中生成15秒視頻需綜合考慮視頻參數配置、模型選擇和硬件優化&#xff0c;尤其針對RTX 4060 8G顯存的限制。 ?? 一、影響視頻長度的核心參數 總幀數&#xff08;video_…

Netty 實戰篇:構建高性能聊天服務器

在前兩篇文章中&#xff0c;我們深入探討了 Netty 的 IO 模型以及其核心組件的工作原理。本篇文章將通過一個實際的聊天服務器示例&#xff0c;展示如何使用 Netty 構建高性能的網絡應用。 一、項目結構 項目主要包含以下幾個部分&#xff1a; ChatServer&#xff1a;服務器啟…

智紳科技——科技賦能健康養老,構建智慧晚年新生態

當老齡化浪潮與數字技術深度碰撞&#xff0c;智紳科技以 “科技賦能健康&#xff0c;智慧守護晚年” 為核心理念&#xff0c;錨定數字健康與養老服務賽道&#xff0c;通過人工智能、物聯網、大數據等技術集成&#xff0c;為亞健康群體與中老年人群構建 “監測 - 預防 - 輔助 - …

Tkinter軟件——顯示txt標簽的目標水平邊框圖像

代碼&#xff1a; import tkinter as tk from tkinter import filedialog from tkinter import messagebox import cv2 from PIL import Image, ImageTk import osclass ImageBoxApp:def __init__(self, master):self.master masterself.master.title("Image Box Drawer…

Linux 文件覆蓋機制與實踐:以 mv 命令為切入點

引言&#xff1a;文件覆蓋的本質 文件覆蓋是 Linux 文件系統中常見的操作&#xff0c;指的是在目標路徑已存在文件的情況下&#xff0c;將源文件的內容寫入目標文件&#xff0c;導致目標文件的原有內容被替換。在 Linux 中&#xff0c;文件覆蓋通常通過命令行工具&#xff08;…

學習路之PHP--easyswoole操作數據庫

學習路之PHP--easyswoole操作數據庫 0、安裝orm插件一、創建數據庫二、創建模型三、控制器顯示四、效果五、問題 0、安裝orm插件 composer require easyswoole/orm一、創建數據庫 表&#xff1a; CREATE TABLE cases (id int(11) NOT NULL AUTO_INCREMENT COMMENT 主鍵,titl…

手寫multi-head Self-Attention,各個算子詳細注釋版

文章目錄 MultiHeadAttentionFormal的實現操作詳解1. &#x1f50d; attention_mask2. &#x1f50d; matmul? 其他實現方式1. 使用 運算符&#xff08;推薦簡潔寫法&#xff09;2. 使用 torch.einsum()&#xff08;愛因斯坦求和約定&#xff09;3. 使用 torch.bmm()&#xf…