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.pswp.cn/diannao/82779.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/82779.shtml
英文地址,請注明出處:http://en.pswp.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 # 數據庫模型定義 │ │ …