当前位置: 首页 > news >正文

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.xdnf.cn/news/400555.html

相关文章:

  • Qt进阶开发:QTcpServer的的详解
  • 对抗进行性核上性麻痹,健康护理筑牢生活防线
  • Golang 应用的 CI/CD 与 K8S 自动化部署全流程指南
  • 深度拆解!MES如何重构生产计划与排产调度全流程?
  • 【软件工程】软件缺陷 基于组合的优化方法
  • 获取高德地图JS API的安全密钥和Key的方法
  • HBase进阶之路:从原理到实战的深度探索
  • 1.6 偏导数
  • Ollama+OpenWebUI+docker附带软件下载链接,配置流程,适合内网部署,可以多人内网使用
  • CSS3(BFC)
  • 智能家居“心脏“升级战:GD25Q127CSIG国产芯片如何重构家庭物联生态
  • Lodash isEqual 方法源码实现分析
  • 企业级商城系统容器化部署技术方案
  • 【Linux】socket网络编程之TCP
  • mac M2下虚拟机CentOS 8 安装上安装 Berkeley DB
  • tar -zxvf jdk-8u212-linux-x64.tar.gz -C /opt/module/这个代码的解释
  • 2.3 定积分
  • [Spring]-组件注入
  • 【C++重载操作符与转换】构造函数和复制控制
  • 嵌入式培训之数据结构学习(一)数据结构的基础概念、线性表
  • 【AXI总线专题】AXI-FULL-Master
  • 具身-机器人-分层框架-大脑模块-RoboBrain1.0 RoboOS
  • AI大模型学习二十、利用Dify+deepseekR1 使用知识库搭建初中英语学习智能客服机器人
  • IBM BAW(原BPM升级版)使用教程第十二讲
  • ACL访问控制列表:access-list 10 permit 192.168.10.1
  • Matlab 模糊pid的液压舵机伺服系统
  • 重构金融数智化产业版图:中电金信“链主”之道
  • 【AI提示词】波特五力模型专家
  • Jenkins:库博静态工具CI/CD 的卓越之选
  • Pytorch常用统计和矩阵运算