在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. 实际工作经验与注…