一文讀懂WPF系列之MVVM

WPF MVVM

  • 什么是MVVM
  • WPF為何使用MVVM機制
    • WPFMVVM 的實現手段
  • INotifyPropertyChanged
    • ?數據綁定的源端通知??
    • 原理 PropertyChanged事件
    • 雙向綁定的完整條件
    • 常見疑惑問題

什么是MVVM

翻譯全稱就是 model-view-viewmodel 3部分內容

  1. 以wpf的概念角度來解釋就是 數據庫數據源模型----xmal UI視圖----DataContext?? Viewmodel使用模型承載方式

  2. 以技術點的角度來解釋就是通過 UI的依賴屬性 - binding-ViewModel 數據之間 雙向綁定
    UI控件內容變動可以作用于viewmodel,viewmodel模型內容變動也可以作用于UI控件內容顯示

WPF為何使用MVVM機制

  1. 職責分離??
    ??View??:僅負責 UI 呈現,通過 XAML 綁定依賴屬性。
    ??ViewModel??:處理業務邏輯,通過 INotifyPropertyChanged 驅動數據流。
    ??Model??:封裝數據結構和業務規則。
  2. ??可測試性與維護性??
    ViewModel 獨立于 UI,便于單元測試。
    樣式與邏輯解耦,支持設計師與開發者并行工作

WPFMVVM 的實現手段

在 WPF 中,??依賴屬性??、??數據綁定??和 ??INotifyPropertyChanged?? 是支撐 MVVM(Model-View-ViewModel)設計模式的三大核心

  1. 依賴屬性與 View 的綁定??
    ??自定義控件??:通過依賴屬性定義控件行為(如 NumericBox.Value),并綁定到 ViewModel 屬性。
    ??數據模板??:在控件模板中使用 TemplateBinding 關聯依賴屬性與模板元素。
  2. ??INotifyPropertyChanged 與 ViewModel 的綁定??
    ??數據驅動 UI??:ViewModel 的 CLR 屬性通過 INotifyPropertyChanged 實現雙向綁定,例如用戶輸入實時同步到數據源。
    ??工具輔助??:使用 Fody 庫的 [ImplementPropertyChanged] 特性自動生成屬性變更代碼,減少樣板代碼。
  3. ??數據綁定引擎的協作??
    ??綁定模式??:
    ??單向綁定??(OneWay):依賴屬性監聽 ViewModel 屬性變化。
    ??雙向綁定??(TwoWay):依賴屬性與 ViewModel 屬性互相更新,例如 TextBox.Text 與 ViewModel.InputText。
    ??驗證與轉換??:通過 IValueConverter 和 ValidationRule 實現數據格式轉換與輸入驗證

INotifyPropertyChanged

?數據綁定的源端通知??

??ViewModel 的職責??:ViewModel 中的 CLR 屬性需實現 INotifyPropertyChanged,以便在值變更時通過 PropertyChanged 事件通知 UI 更新

public class ViewModel : INotifyPropertyChanged {private string _userName;public string UserName {get => _userName;set { _userName = value; OnPropertyChanged(nameof(UserName)); }}public event PropertyChangedEventHandler PropertyChanged;protected void OnPropertyChanged(string propertyName) => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}<TextBox Text="{Binding UserName, Mode=TwoWay}" />

原理 PropertyChanged事件

  1. INotifyPropertyChanged 是一個接口,定義了一個 PropertyChanged 事件
  2. 當 ViewModel 中的屬性值發生變化時,觸發 PropertyChanged 事件,并傳遞屬性名稱。
  3. WPF 的綁定引擎會監聽此事件,并根據屬性名稱更新對應的 UI 元素

雙向綁定的完整條件

  1. 目標屬性是依賴屬性??(如 TextBox.Text)。
  2. 源屬性實現 INotifyPropertyChanged??(ViewModel 屬性)。
  3. ??顯式設置 Mode=TwoWay??(除非依賴目標屬性默認支持雙向)。
  4. ??更新觸發時機??:通過 UpdateSourceTrigger 控制同步時機(如 PropertyChanged 或 LostFocus)

常見疑惑問題

  1. 如果沒有用到INotifyPropertyChanged,即使binding 設置了 twoway 也無法viewmodel變更后 作用UI顯示
  2. 綁定不更新
    可能原因:
    未正確調用 OnPropertyChanged。
    屬性名稱拼寫錯誤(使用 nameof 避免)。
    未啟用 Mode=TwoWay(如需要從 View 更新到 ViewModel)
  3. 目前DataContext??是通過=this的寫法 來表現數據源的,無法使用mvvm 所以為什么推薦使用 viewmodel的寫法來使用,DataContext = this 的適用場景??:僅適用于原型驗證或極小規模工具,不推薦生產環境使用
  4. 在 WPF 中,若綁定模式設置為 OneWay,且 ViewModel 實現了 INotifyPropertyChanged 接口,??數據源的變更會觸發 UI 更新??,但 UI 的修改不會反向同步到數據源

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

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

相關文章

OCR API識別對比

OCR 識別DEMO OCR識別 demo 文檔由來 最開始想使用百度開源的 paddlepaddle大模型 研究了幾天&#xff0c;發現表格識別會跨行&#xff0c;手寫識別的也不很準確。最終還是得使用現成提供的api。。 文檔說明 三個體驗下來 騰訊的識別度比較高&#xff0c;不論是手寫還是識別表…

嵌入式MCU常用模塊

日后填坑。 無線通信模塊 2.4G 基本介紹 以NRF24L01為例。 NRF24L01是一款2.4GHz的無線收發模塊&#xff0c;支持SPI通信協議&#xff0c;具有低功耗、高數據速率&#xff08;250kbps-2Mbps&#xff09;和多設備通信能力。 它可以同時與最多6個其他模塊通信&#xff0c;適合…

記一次InternVL3- 2B 8B的部署測驗日志

測試效果&#xff1a; 問題和耗時如圖 5、資源占用 不釋放資源會一直漲顯存。總體還算滿意&#xff0c;我試了好多個圖理解大模型&#xff0c;就屬它牛一點 附圖一張 補充&#xff0c;測試InternVL3-2B的結果 1、模型下載魔搭社區 2、運行環境&#xff1a; 1、硬件 RTX 30…

Java版本對應關系表

Java版本對應關系表 以下Java主要版本&#xff08;Major Version&#xff09;與公開大版本號的對應關系 公開大版本名稱Major 版本號內部版本號格式示例&#xff08;java -version輸出&#xff09;Java 8 (1.8)52 (0x34)1.8.0_XXX1.8.0_301Java 953 (0x35)9.0.X9.0.4Java 105…

2025最新版flink2.0.0安裝教程(保姆級)

Flink支持多種安裝模式。 local&#xff08;本地&#xff09;——本地模式 standalone——獨立模式&#xff0c;Flink自帶集群&#xff0c;開發測試環境使用 standaloneHA—獨立集群高可用模式&#xff0c;Flink自帶集群&#xff0c;開發測試環境使用 yarn——計算資源統一…

android11 配置默認電池優化白名單

目錄 1.介紹 2.讀取配置文件 3.默認配置一個白名單列表 1.介紹 在 Android 11 中,DeviceIdleController 是負責控制設備進入 Doze 模式(閑置模式) 的核心系統服務,其內部方法 readConfigFileLocked() 負責從配置文件中讀取 Doze 模式的行為參數,包括 idle 階段的時間間…

java中的Future的設計模式 手寫一個簡易的Future

案例 例如&#xff1a;今天是小妹的生日&#xff0c;需要一個蛋糕有點儀式感&#xff0c;于是去蛋糕店預定&#xff0c;預定完之后&#xff0c;店老板說蛋糕做好了&#xff0c;到時電話通知你&#xff0c;不可能在這傻傻的等著吧&#xff0c;還有其他事情要做啊&#xff0c;于…

【Redis】Redis C++使用

一、Redis的自定義網絡協議 1.1 為什么可以編寫出一個自定義的Redis客戶端 為什么我們可以編寫出一個自定義的Redis客戶端&#xff1f;因為Redis公開了自己的自定義協議。而對于一些其他軟件的客戶端&#xff0c;我們無法編寫出一個自定義的Redis客戶端&#xff0c;因為他們沒…

【軟考系統架構設計師】軟件工程知識點

1、 軟件開發生命周期 軟件定義時期&#xff1a;包括可行性研究和詳細需求分析過程&#xff0c;任務是確定軟件開發工程必須完成的總目標&#xff0c;具體分為問題定義、可行性研究、需求分析等 軟件開發時期&#xff1a;軟件的設計與實現&#xff0c;分為概要設計、詳細設計、…

DeepSeek 與開源:肥沃土壤孕育 AI 碩果

當國產 AI DeepSeek 以其低成本推理和多模態能力在全球范圍內引起轟動時&#xff0c;人們驚嘆于中國技術的迅猛發展&#xff0c;卻很少有人深究這一成就背后的根基。答案其實早已寫在中國開源生態二十多年的發展歷程中。 從倪光南院士提出“以開源打破技術壟斷”的理念&#x…

職坐標:智慧城市未來發展的核心驅動力

內容概要 智慧城市的演進正以顛覆性創新重構人類生存空間&#xff0c;其發展脈絡由物聯網、人工智能與云計算三大技術支柱交織而成。這些技術不僅推動城市治理從經驗決策轉向數據驅動模式&#xff0c;更通過實時感知與智能分析&#xff0c;實現交通、能源等領域的精準調控。以…

vue復習46~90

1.小兔鮮 所有都折疊 ctrl k,ctrl0 所有都展開 ctrl k,ctrlj當前結構渲染5次 <BaseBrandItem v-for"item in 5" :key"item"><BaseBrandItem>2.scoped樣式沖突 結構&#xff1a;只能有一個根元素樣式&#xff1a;全局樣式(默認)&#xff1…

PHP 用 workman 即時通訊,做個簡版QQ

1. workman是什么 &#xff0c;一般應用在那些地方 workerman是一個高性能的PHP socket 服務器框架&#xff0c;workerman基于PHP多進程以及libevent事件輪詢庫&#xff0c;PHP開發者只要實現一兩個接口&#xff0c;便可以開發出自己的網絡應用&#xff0c;例如Rpc服務、聊天室…

【WORD】批量將doc轉為docx

具體步驟進行&#xff1a; 打開Word文檔&#xff0c;按下AltF11快捷鍵&#xff0c;打開VBA編輯器。在VBA編輯器中&#xff0c;左側的“項目資源管理器”窗口會顯示當前打開的Word文檔相關項目。找到您要添加代碼的文檔項目&#xff08;通常以文檔名稱命名&#xff09;&#xf…

【免費】【實測有用】5KPlayer Windows 電腦作為 MacBook 無線擴展屏

總結&#xff1a;使用 5KPlayer 將 Windows 電腦作為 MacBook 無線擴展屏 準備工作 設備要求&#xff1a; MacBook 和 Windows 電腦需連接到同一 Wi-Fi 網絡。【這里有雷&#xff1a;eduroam不會成功&#xff0c;家里的WIFI成功了&#xff0c;需要確認校園網是否可行。】確保…

華為華三模擬器解決兼容問題Win11 24H2 現在使用ENSP的問題解決了

一、Win11 24H2 現在使用ENSP的問題解決了 這個Win11 的 24H2不能使用ENSP的問題已經困擾我們很久了,在之前的文章中,我們也有說明這個問題 之前ENSP肯定啟動會報錯40 當時還建議大家先不要更新到win11的24H2版本,現在終于迎來了更新,不用再擔心了,包括早就升級了24H2版…

嵌入式WebRTC輕量化SDK壓縮至500K-800K ,為嵌入式設備節省Flash資源

一、SDK輕量化的核心技術實現 1、WebRTC庫裁剪與模塊化設計 EasyRTC針對嵌入式設備的資源限制&#xff0c;對原生WebRTC庫進行深度裁剪&#xff0c;僅保留核心通信功能&#xff08;如信令管理、編解碼、網絡傳輸等&#xff09;&#xff0c;移除冗余組件&#xff08;如部分調試…

Maya云渲染工作流,提升渲染速度

在三維動畫與影視特效領域&#xff0c;Autodesk Maya作為行業標桿工具&#xff0c;承載著從角色建模到復雜特效渲染的全流程創作。然而&#xff0c;本地硬件性能不足、渲染周期漫長、跨團隊協作效率低等痛點始終困擾著創作者。渲染101云渲染以彈性算力資源、智能化工作流與全方…

git怎么使遠程分支回退到指定的節點處

git使遠程分支回退到指定的節點 引言場景描述步驟 引言 最近提交代碼的時候&#xff0c;總將分支合并錯&#xff0c;原本要合到A分支&#xff0c;結果合并到了B分支&#xff0c;這樣就導致b分支需要回退到我沒有合并之前的節點處。 本文記錄下怎么將遠程分支回退到指定的節點。…

全網通emotn ui桌面免費嗎?如何開機自啟動

在智能設備的使用中&#xff0c;一款優秀的桌面系統能帶來截然不同的體驗。全網通Emotn UI桌面便是其中的佼佼者&#xff0c;它以完全免費的特性與卓越性能&#xff0c;成為眾多用戶的心頭好。 其簡潔美觀的界面設計如同為設備換上"清新外衣"&#xff0c;常用功能一…