C#中SetProperty方法使用

SetProperty 是 MVVM(Model-View-ViewModel) 模式中用于实现 属性变更通知(INotifyPropertyChanged) 的核心方法,主要用于在属性值变化时自动更新 UI 绑定。


1. SetProperty 的基本作用

  • 更新字段值:修改属性的私有字段(backing field)。

  • 触发通知:如果值发生变化,自动发出 PropertyChanged 事件,通知 UI 更新。

  • 避免重复更新:如果新值和旧值相同,则不触发事件,提高性能。


2. SetProperty 的典型实现

通常在 ViewModel 基类 中定义,例如:

(1)基础版本(带 [CallerMemberName] 自动获取属性名)

using System.ComponentModel;
using System.Runtime.CompilerServices;public class ObservableObject : INotifyPropertyChanged
{public event PropertyChangedEventHandler? PropertyChanged;protected bool SetProperty<T>(ref T field, T value, [CallerMemberName] string propertyName = ""){if (EqualityComparer<T>.Default.Equals(field, value))return false; // 值未变化,不触发更新field = value; // 更新字段值OnPropertyChanged(propertyName); // 触发通知return true;}protected void OnPropertyChanged(string propertyName){PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));}
}
参数说明
  • ref T field:属性的私有字段(如 axisXStatusInfo)。

  • T value:要设置的新值。

  • [CallerMemberName] string propertyName:自动获取调用该方法的属性名(如 "AxisXStatusInfo")。

返回值
  • true:值已更改,并触发了 PropertyChanged 事件。

  • false:值未更改,不触发事件。


(2)扩展版本(支持自定义回调)

protected bool SetProperty<T>(ref T field,T value,Action<T>? onChanged = null,[CallerMemberName] string propertyName = "")
{if (EqualityComparer<T>.Default.Equals(field, value))return false;field = value;onChanged?.Invoke(value); // 可选:值变化后执行额外逻辑OnPropertyChanged(propertyName);return true;
}
用法示例
private string _name;public string Name
{get => _name;set => SetProperty(ref _name, value, (newValue) => {Console.WriteLine($"Name 从 {_name} 变为 {newValue}");});
}

3. 如何在 ViewModel 中使用 SetProperty

假设有一个 ViewModel 继承自 ObservableObject

public class MainViewModel : ObservableObject
{private string _status;public string Status{get => _status;set => SetProperty(ref _status, value); // 自动触发 UI 更新}private int _count;public int Count{get => _count;set => SetProperty(ref _count, value, onChanged: (newCount) =>{Console.WriteLine($"Count 更新为 {newCount}");});}
}

4. 为什么需要 SetProperty

  • 简化 INotifyPropertyChanged 的实现:避免在每个属性的 set 里手动写 OnPropertyChanged

  • 提高性能:仅在值真正变化时触发事件。

  • 支持自动属性名推断[CallerMemberName] 避免硬编码属性名,减少错误。


5. 常见问题

(1)SetProperty 和 OnPropertyChanged 的区别?

  • SetProperty:用于 修改属性值并触发通知

  • OnPropertyChanged:仅 手动触发通知(适用于计算属性或依赖属性)。

(2)如果不使用 SetProperty,传统写法是怎样的?

private string _name;public string Name
{get => _name;set{if (_name != value){_name = value;OnPropertyChanged(nameof(Name));}}
}

SetProperty 让这段代码更简洁、更安全。


总结

功能SetProperty 的作用
更新字段值field = value
自动触发 UI 更新调用 OnPropertyChanged
避免重复更新检查新旧值是否相同
支持回调可选 onChanged 逻辑
自动获取属性名[CallerMemberName]

如果你的项目使用 WPF / MAUI / Xamarin / Avalonia 等 MVVM 框架,SetProperty 是管理属性变更的最佳实践!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/82779.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MYSQL 全量,增量备份与恢复

目录 一 数据备份的重要性 1 数据备份的重要性 2 数据库备份类型 2.1 从物理与逻辑的角度分类 2.2. 从数据库的备份策略角度分类从数据库的备份策略角度,数据库的备份可分为完全备份、差异备份和增量备份。 3 常见的备份方法 3.1 物理冷备份 物理冷备份时需要在数据库处…

豆瓣电影Top250数据工程实践:从爬虫到智能存储的技术演进(含完整代码)

目录 引言:当豆瓣榜单遇见大数据技术 项目文档 1.1 选题背景 1.2 项目目标 2. 项目概述 2.1 系统架构设计 2.2 技术选型 2.3 项目环境搭建 2.3.1 基础环境准备 2.3.2 爬虫环境配置 2.3.3 Docker安装ES连接Kibana 安装IK插件 2.3.4 vscode依赖服务安装 3. 核心模…

深度 |国产操作系统“破茧而出”:鸿蒙电脑填补自主生态空白

真心为国内能有像华为这样的技术型公司而自豪&#xff0c;一步步突围技术封锁。从这篇信息&#xff0c;可以给软件从业者一个启示&#xff1a;鸿蒙生态将是一个新的机会&#xff0c;值得好好把握。 鸿蒙电脑正成为中国电子信息技术新坐标。 超10亿鸿蒙生态设备、2800家鸿蒙智…

【网络安全】——大端序(Big-Endian)​​和​​小端序(Little-Endian)

字节序&#xff08;Endianness&#xff09;是计算机系统中多字节数据&#xff08;如整数、浮点数&#xff09;在内存中存储或传输时&#xff0c;​​字节排列顺序​​的规则。它分为两种类型&#xff1a;​​大端序&#xff08;Big-Endian&#xff09;​​和​​小端序&#xf…

六个仓库合并为一个仓库,保留master和develop分支的bat脚本

利用git subtree可以实现多个仓库合并为一个仓库&#xff0c;手动操作起来太麻烦了&#xff0c;今天花了点时间写了一个可执行的脚本&#xff0c;现在操作起来就方便多了。 1、本地新建setup.bat文件 2、用编辑器打开&#xff08;我用的是Notepad&#xff09; 3、把下面代码…

使用定时器监视当前PID 如果当前程序关闭 UI_Core.exe 也随之自动关闭实现方法

使用定时器监视当前PID 如果当前程序关闭 UI_Core.exe 也随之自动关闭实现方法 描述: C20 QT6.9 VS2022 中使用QProcess::startDetached(“UI_Core.exe”, QStringList(), QString(), &UI_Manage_pid);是启动目标程序 能否同时告诉目标程序当前宿主程序的PID,在UI_CORE.EX…

神经网络是如何工作的

人工智能最核心的技术之一&#xff0c;就是神经网络&#xff08;Neural Networks&#xff09;。但很多初学者会觉得它是个黑盒&#xff1a;为什么神经网络能识别图片、翻译语言&#xff0c;甚至生成文章&#xff1f; 本文用图解最小代码实现的方式&#xff0c;带你深入理解&am…

LeetCode热题100 两数之和

目录 两数之和题目解析方法一暴力求解代码 方法二哈希代码 感谢各位大佬对我的支持,如果我的文章对你有用,欢迎点击以下链接 &#x1f412;&#x1f412;&#x1f412; 个人主页 &#x1f978;&#x1f978;&#x1f978; C语言 &#x1f43f;️&#x1f43f;️&#x1f43f;…

在线服务器具体是指什么?

在线服务器主要是指一种能够随时进行网络连接、管理和操作的服务器&#xff0c;在线服务器是通过互联网或者是本地网络&#xff0c;来为企业和用户提供数据存储和网络服务的&#xff0c;在线服务器也可以是物理服务器或者是虚拟服务器&#xff0c;能够根据远程访问工具进行管理…

OSPF综合性实验

实验拓扑&#xff1a; 第一步&#xff1a;进行子网划分 172.16.0.0/17 172.16.0000 00 00.00000000 -- area1 172.16.0.1/22 -- AR1--G0/0/0 172.16.0.2/22 -- AR2--G0/0/0 172.16.0.3/22 -- AR3--G0/0/0 172.16.4.1/22 -- AR1-- Lo0 172.16.8.2/22 -- AR2-- Lo0 172.16.12.3/…

WEB前端表单及表格标签综合案例

表单标签综合案例&#xff1a; 源代码&#xff1a; <!DOCTYPE html> <html lang"zh"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>…

实战项目3(04)

​​​​​​目录 ​​​​​​任务场景一 【r1配置】 【sw1配置】 任务场景二 【r1配置】 【sw1配置】 【sw2配置】 任务场景一 某公司网络为了减少广播包对网络的影响&#xff0c;网络管理员对网络进行了VLAN划分&#xff0c;完成VLAN划分后&#xff0c;为了不影响VL…

tinyint(3)数据类型讲解

TINYINT(3) 是数据库中用于定义字段数据类型的一种写法&#xff0c;常见于 MySQL 等数据库系统。下面来详细了解其含义和作用&#xff1a; 数据类型本质 TINYINT 属于整数类型&#xff0c;在不同的数据库系统中&#xff0c;它所占用的存储空间和表示范围通常是固定的。以 MyS…

[原创](现代Delphi 12指南):[macOS 64bit App开发]: 如何获取自身程序的所在的目录?

[作者] 常用网名: 猪头三 出生日期: 1981.XX.XX 企鹅交流: 643439947 个人网站: 80x86汇编小站 编程生涯: 2001年~至今[共24年] 职业生涯: 22年 开发语言: C/C++、80x86ASM、Object Pascal、Objective-C、C#、R、Python、PHP、Perl、 开发工具: Visual Studio、Delphi、XCode、…

自定义prometheus exporter实现监控阿里云RDS

# 自定义 Prometheus Exporter 实现多 RDS 数据采集## 背景1. Prometheus 官网提供的 MySQL Exporter 对于 MySQL 实例只能一个进程监控一个实例&#xff0c;数据库实例很多的情况下&#xff0c;不方便管理。 2. 内部有定制化监控需求&#xff0c;RDS 默认无法实现&#xff0c;…

开放原子大赛石油软件赛道参赛经验分享

亿级以上网格油藏模型三维可视化 一、赛项背景 油藏数值模拟是油气田开发中至关重要的一环。油藏数值模拟将储层与井的数学模型离散求解&#xff0c;预测地下流体、能量等的动态变化&#xff0c;广泛应用于油田产量评估、开发方案优化等。随着计算机技术特别是并行技术的发展…

学习方法讨论——正论科举精神的内核

世界不存在绝对的善&#xff0c;可以很善&#xff0c;但很难找到绝对的善&#xff0c;总带些副作用&#xff1b;世界上也不存在绝对的恶&#xff0c;可以很恶&#xff0c;但很难找到绝对的恶&#xff0c;可以尝试举例&#xff1b; 再者&#xff0c;物极必反&#xff0c;当对一个…

网络不再神秘:如何有效利用服务器网络流量探针进行监控?

目录 一、流量探针到底是个啥&#xff1f; 二、别只是“部署了”&#xff0c;关键在“用得好” 1. 做到“最小粒度”数据采集 2. 结合时间窗口&#xff0c;构建行为基线 3. 利用标签化管理&#xff0c;提升可读性 4. 把探针输出对接安全告警系统 三、那如何部署才合理&a…

uniapp(微信小程序)>关于父子组件的样式传递问题(自定义组件样式穿透)

在父组件中给子组件添加类名,子组件的样式由父组件决定 由于"微信小程序"存在【样式隔离机制】&#xff0c;且默认设置为isolated(启用样式隔离)&#xff0c;因此这里给出以下两种解决方案&#xff1a; // 小程序编译机制 1. 当 <style scoped> 存在时&#…

基于FastAPI框架的日志模块设计

以下是一个基于FastAPI框架设计的日志模块&#xff0c;结合SQLite数据库实现增删改查功能的完整实现方案&#xff1a; 1. 项目结构 your_project/ ├── app/ │ ├── logs/ # 日志模块目录 │ │ ├── models.py # 数据库模型定义 │ │ …