【C#】MVVM知識點匯總-2

在C#中實現MVVM(Model-View-ViewModel)架構時,可以總結以下幾個關鍵知識點,并通過具體的代碼示例來進行說明。

?

1. 模型 (Model)

模型包含應用程序中的數據和業務邏輯。通常與數據庫交互。

public class User

{

? ? public int Id { get; set; }

? ? public string Name { get; set; }

? ? public int Age { get; set; }

}

?

2. 視圖 (View)

視圖是UI部分,包括窗口、控件以及布局等。

<Window x:Class="MVVMExample.MainWindow"

? ? ? ? xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

? ? ? ? xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

? ? ? ? Title="MainWindow" Height="350" Width="525">

? ? <Grid>

? ? ? ? <TextBox x:Name="txtName" Margin="10" Text="{Binding User.Name, UpdateSourceTrigger=PropertyChanged}" />

? ? ? ? <TextBox x:Name="txtAge" Margin="10" HorizontalAlignment="Right" Text="{Binding User.Age, StringFormat={} {0:D2}, UpdateSourceTrigger=PropertyChanged}" />

? ? </Grid>

</Window>

?

3. 視圖模型 (ViewModel)

視圖模型封裝了應用程序的數據邏輯和業務規則,并且負責與View進行交互,提供給View顯示所需的數據以及處理用戶輸入。

using System.ComponentModel;

?

public class UserViewModel : INotifyPropertyChanged

{

? ? private User _user = new User();

? ??

? ? public UserViewModel()

? ? {

? ? ? ? _user.Name = "John Doe";

? ? ? ? _user.Age = 30;

? ? }

?

? ? public User User

? ? {

? ? ? ? get => _user;

? ? ? ? set

? ? ? ? {

? ? ? ? ? ? if (_user != value)

? ? ? ? ? ? {

? ? ? ? ? ? ? ? _user = value;

? ? ? ? ? ? ? ? OnPropertyChanged("User");

? ? ? ? ? ? }

? ? ? ? }

? ? }

?

? ? public event PropertyChangedEventHandler PropertyChanged;

?

? ? protected void OnPropertyChanged(string name)

? ? {

? ? ? ? PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));

? ? }

}

?

4. 數據綁定 (Data Binding)

數據綁定是MVVM模式的核心。它可以自動同步ViewModel中的屬性到視圖上對應的控件。

<Window.DataContext>

? ? <local:UserViewModel />

</Window.DataContext>

?

<!-- 其他 UI 定義 -->

?

5. 命令 (Command)

命令用于在View和ViewModel之間傳遞用戶操作。

using System.Windows.Input;

?

public class RelayCommand : ICommand

{

? ? private readonly Action<object> _execute;

? ? private readonly Func<object, bool> _canExecute;

?

? ? public RelayCommand(Action<object> execute) : this(execute, null) { }

?

? ? public RelayCommand(Action<object> execute, Func<object, bool> canExecute)

? ? {

? ? ? ? _execute = execute ?? throw new ArgumentNullException(nameof(execute));

? ? ? ? _canExecute = canExecute;

? ? }

?

? ? public event EventHandler CanExecuteChanged

? ? {

? ? ? ? add => CommandManager.RequerySuggested += value;

? ? ? ? remove => CommandManager.RequerySuggested -= value;

? ? }

?

? ? public bool CanExecute(object parameter)

? ? {

? ? ? ? return _canExecute == null || _canExecute(parameter);

? ? }

?

? ? public void Execute(object parameter)

? ? {

? ? ? ? _execute?.Invoke(parameter);

? ? }

}

?

6. 命令綁定 (Command Binding)

<Button Content="Click Me" Command="{Binding MyCommand}" />

public class UserViewModel : INotifyPropertyChanged

{

? ? // ... 其他代碼

?

? ? public ICommand MyCommand { get; private set; }

?

? ? public UserViewModel()

? ? {

? ? ? ? MyCommand = new RelayCommand(param =>

? ? ? ? {

? ? ? ? ? ? MessageBox.Show("Button clicked!");

? ? ? ? });

? ? }

}

?

7. 資源字典 (Resource Dictionaries)

資源字典用于存儲如顏色、字體、樣式和模板之類的可重用資源。

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml"

? ? ? ? ? ? ? ? ? ? ?xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">

?

? ? <Style x:Key="MyTextBoxStyle" TargetType="{x:Type TextBox}">

? ? ? ? <Setter Property="Background" Value="LightBlue"/>

? ? ? ? <Setter Property="BorderBrush" Value="DarkGray"/>

? ? ? ? <Setter Property="FontSize" Value="14"/>

? ? </Style>

?

</ResourceDictionary>

<Window.Resources>

? ? <ResourceDictionary Source="/Resources/Styles.xaml"/>

</Window.Resources>

?

<!-- 使用資源字典中的樣式 -->

<TextBox Style="{StaticResource MyTextBoxStyle}" />

?

8. 自定義控件 (Custom Controls)

自定義控件允許擴展現有的WPF控件,以適應特定的UI需求。

using System.Windows.Controls;

using System.Windows;

?

public class CustomTextBox : TextBox

{

? ? static CustomTextBox()

? ? {

? ? ? ? DefaultStyleKeyProperty.OverrideMetadata(typeof(CustomTextBox), new FrameworkPropertyMetadata(typeof(CustomTextBox)));

? ? }

?

? ? public static readonly DependencyProperty IsReadOnlyProperty =

? ? ? ? DependencyProperty.Register("IsReadOnly", typeof(bool), typeof(CustomTextBox));

?

? ? public bool IsReadOnly

? ? {

? ? ? ? get { return (bool)GetValue(IsReadOnlyProperty); }

? ? ? ? set { SetValue(IsReadOnlyProperty, value); }

? ? }

}

?

9. 視圖加載與生命周期管理

<Window x:Class="MVVMExample.MainWindow"

? ? ? ? xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

? ? ? ? xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

? ? ? ? Title="MainWindow" Height="350" Width="525">

? ? <Grid>

? ? ? ? <!-- UI 元素 -->

? ? </Grid>

?

? ? <Window.Resources>

? ? ? ? <local:UserViewModel x:Key="MainVM"/>

? ? </Window.Resources>

?

? ? <Window.DataContext>

? ? ? ? <Binding Source="{StaticResource MainVM}"/>

? ? </Window.DataContext>

</Window>

?

10. 視圖模型中的依賴注入

public class UserViewModel : INotifyPropertyChanged

{

? ? private readonly IUserService _userService;

?

? ? public UserViewModel(IUserService userService)

? ? {

? ? ? ? _userService = userService;

? ? }

?

? ? // 其他代碼...

}

?

使用Unity容器進行依賴注入:

using Unity;

using System.Windows.Threading;

?

public class AppBootstrapper : UnityBootstrapper

{

? ? protected override void InitializeShell()

? ? {

? ? ? ? base.InitializeShell();

? ? ? ??

? ? ? ? var shell = (MainWindow)Shell;

? ? ? ? var viewModel = Container.Resolve<UserViewModel>();

? ? ? ? shell.DataContext = viewModel;

? ? }

?

? ? protected override DependencyObject CreateShell()

? ? {

? ? ? ? return new MainWindow();

? ? }

}

以上是對C#中MVVM模式的關鍵知識點及對應的代碼示例。通過這些例子,你可以更好地理解和實現MVVM架構。

?

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

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

相關文章

一文了解PMI、CSPM、軟考、、IPMA、PeopleCert和華為項目管理認證

1 引言 常見的項目管理方面的認證有PMI、IPMA、PeopleCert、CSPM、軟考和華為項目管理認證6個認證。本篇文章讓你一文了解各認證的基本主要內容。 2 核心定位 目前全球范圍內最具影響力的六大認證體系各有特色&#xff0c;源于不同的管理哲學和實踐背景。六大認證體系的核心…

bean注入的過程中,Property of ‘java.util.ArrayList‘ type cannot be injected by ‘List‘

一、問題 在spring實踐bean注入ArrayList屬性的時候報錯&#xff1a;Property of ‘java.util.ArrayList’ type cannot be injected by ‘List’二、原因分析 在嘗試將 Spring 配置中的 注入到一個 ArrayList 類型的屬性時出現了類型不匹配問題。核心問題在于&#xff1a;Spr…

自注意力機制原理: 向量矩陣案例進行說明

自注意力機制原理: 向量矩陣案例進行說明 目錄 自注意力機制原理: 向量矩陣案例進行說明一個單詞和所有單詞進行乘法運算,提取特征一、場景設定:翻譯句子“我喜歡深度學習”二、向量矩陣構建:以“我”為例計算自注意力三、矩陣視角:批量計算整個序列的自注意力四、向量矩…

D3 面試題100道之(61-80)

這里是D3的面試題,我們從第 61~80題 開始逐條解答。一共100道,陸續發布中。 ?? 面試題(第 61~80 題) 61. D3 中如何繪制餅圖? 使用 d3.pie() 生成角度數據,再結合 d3.arc() 創建路徑。 示例: const data = [10, 20, 30

flutter更改第三方庫pub get的緩存目錄;更改.gradle文件夾存放目錄

1.在目標目錄中新建文件夾flutter_pub_cache 2.在“用戶變量“或“系統變量”中點擊“新建” 變量名: PUB_CACHE 變量值: D:\flutter_pub_cache 3.打開新的終端運行或者從Android studio 控制臺運行&#xff1a;flutter pub cache repair或者flutter pub clean pub讀取新的變…

《Redis》哨兵模式

文章目錄 為什么要有哨兵模式呢&#xff1f;哨兵自動恢復故障主節點使用docker搭建分布式系統查看哨兵節點工作哨兵選舉新的主節點的流程 總結 為什么要有哨兵模式呢&#xff1f; 主從復制的問題 Redis 的主從復制模式可以將主節點的數據改變同步給從節點&#xff0c;這樣從節…

零基礎保姆級本地化部署文心大模型4.5開源系列

近兩年隨著大模型的迅猛崛起&#xff0c;吸引了各行各業的廣泛關注&#xff0c;更對我們的工作方式與生活產生著顯著積極影響。在這樣一個技術范式轉換的關鍵節點&#xff0c;百度文心大模型開源事件無疑具有里程碑意義——它不僅為中國自主研發的AI技術底座打開了通向世界的大…

【筆記】PyCharm 2025.2 EAP 創建 Poetry 和 Hatch 環境的踩坑實錄與反饋

https://youtrack.jetbrains.com/issue/PY-82407/Incorrect-Python-Version-and-Virtual-Environment-Path-When-Creating-Poetry-and-Hatch-Environments-via-GUI-in-PyCharm-2025.2-EAP 在 Python 開發的道路上&#xff0c;PyCharm 一直是我們信賴的開發利器。然而&#xff0…

ASP.NET Web Pages 安裝使用教程

一、ASP.NET Web Pages 簡介 ASP.NET Web Pages 是微軟推出的一種輕量級 Web 開發框架&#xff0c;適合快速開發動態網站。它使用 Razor 語法&#xff0c;可以將 HTML 與 C# 或 VB.NET 無縫融合&#xff0c;特別適合初學者和小型項目。 二、Web Pages 與 MVC 的區別 特性Web …

基于 ethers.js 的區塊鏈事件處理與錢包管理

幣圈工具箱 bqbot.cn 月訪問量達90whttps://bqbot.cn/jms.html &#xff08;在線版地址&#xff09; Event事件 檢索事件 const { ethers } require("hardhat"); async function SearchEvent() {try {const provider new ethers.JsonRpcProvider("http://1…

SpringBoot系列—入門

目錄 1 第一個SpringBoot程序 1.1 創建SpringBoot項目 1.2 選擇SpringBoot版本和必要依賴 1.3 項目目錄結構 1.4 編寫Hello World代碼 1.5 運行程序 1.6 不需要IDEA也能創建SpringBoot程序 1.7 部署程序 1.8 pom.xml依賴問題 1.9 無Maven選項問題 1.10 SpringBoot版…

你的Prompt還有很大提升

與AI協作&#xff0c;Prompt&#xff08;提示詞&#xff09;是溝通的橋梁。一個優秀的Prompt能讓AI的輸出事半功倍&#xff0c;而一個模糊的Prompt則可能導致南轅北轍的結果。如果你覺得AI的回答不夠精準、缺乏深度&#xff0c;或者總帶著一股“AI味”&#xff0c;那很可能是你…

3、Configuring Topics

如果您在應用程序上下文中定義了KafkaAdmin bean&#xff0c;它可以自動向代理添加主題。為此&#xff0c;您可以將每個主題的NewTopicBean添加到應用程序上下文中。2.3版本引入了一個新的類TopicBuilder&#xff0c;使創建此類bean更加方便。以下示例顯示了如何執行此操作&…

FastAPI+React19開發ERP系統實戰第04期

一、效果預覽 1.1 首頁 1.2 首頁暗黑模式 1.3 登錄頁 1.4 登錄頁暗黑模式 二、搭建React開發環境 2.1 項目依賴 package.json {"name": "erp-web","version": "1.0.0","description": "ERP系統前端 - React 19&quo…

數據庫|了解達夢數據庫并做安裝前的準備

哈嘍&#xff0c;你好啊&#xff0c;我是雷工&#xff01; 你都用過哪些數據庫&#xff1f; 使用過的數據庫中覺得哪個數據庫最好用&#xff1f; 你使用過達夢數據庫嗎&#xff1f; 最近在做的一個SCADA項目&#xff0c;要求信創版本&#xff0c;其中數據庫也要使用信創目錄…

Java驅動AI革命:Spring AI八篇進階指南——從架構基礎到企業級智能系統實戰

系列文章目錄 提示&#xff1a;下面列出了整個系列的完整目錄&#xff0c;建議收藏本篇作為總覽入口&#xff1a;本人將在7月份更新完畢 第一篇&#xff1a;Spring AI 概述與架構設計 第二篇&#xff1a;Spring AI 基本組件詳解——ChatClient、Prompt、Memory 第三篇&#x…

hysAnalyser --- 支持菁彩視聽雙Vivid媒體信息解析

摘要 本文主要介紹 hysAnalyser 支持HDR Vivid格式的分析案例&#xff0c;滿足用戶分析HDR vivid 和 Audio Vivid格式的需要。 現將 hysAnalyser 新版本(v1.1.000)發布給網友使用&#xff0c;希望能幫助到更多音視頻開發的愛好者。使用過程中&#xff0c;若遇到問題請您通過 G…

C++中NULL等于啥

文章目錄 **一、`NULL` 的標準定義****二、常見實現方式**1. **定義為整數 `0`**2. **定義為 `0L` 或 `(void*)0`**(較少見)**三、與C語言的關鍵區別****四、`NULL` 在C++中的問題**1. **重載函數匹配歧義**2. **模板參數推導錯誤****五、C++11+ 的替代方案:`nullptr`****六…

pyhton基礎【20】面向對象進階一

目錄 一.進階 類方法和靜態方法 屬性(Properties) 繼承和多態 抽象基類(Abstract Base Classes - ABCs) 魔術方法(Magic Methods) 組合和聚合 使用場景 二.私有屬性 實現對數據的隱藏 設置私有屬性 添加額外對屬性操作的方法 三.私有方法 實現對方法的隱藏 直接…

滲透信息收集- Web應用漏洞與指紋信息收集以及情報收集

目錄 1. 整體流程與目標概述 2. 常用工具及其用途 2.1 掃描與枚舉工具 2.2 情報與數據聚合工具 2.3 流量攔截與手工驗證工具 3. 詳細技術手法與步驟 3.1 準備階段 3.2 主動掃描與指紋識別 3.3 數據交叉驗證與漏洞確認 3.4 進一步滲透與隱蔽操作 4. 實際工作經驗與注…