WinUI3入門2:DataGrid動態更新 添加刪除和修改字段

初級代碼游戲的專欄介紹與文章目錄-CSDN博客

我的github:codetoys,所有代碼都將會位于ctfc庫中。已經放入庫中我會指出在庫中的位置。

這些代碼大部分以Linux為目標但部分代碼是純C++的,可以在任何平臺上使用。

源碼指引:github源碼指引_初級代碼游戲的博客-CSDN博客

C#是我多年以來的業余愛好,新搞的東西能用C#的就用C#了。


? ? ? ? 承接上一篇:WinUI3入門1:使用DataGrid控件顯示表格-CSDN博客。

? ? ? ? 上一篇我們已經顯示了表格,但是只顯示一般是不夠的,我們還要考慮動態修改。本篇我們解決對數據源的修改如何反映到DataGrid控件的問題。

? ? ? ? 說起來“修改”是一個問題,但是分解開是兩個完全不同的問題:

  • 添加和刪除如何反應到界面
  • 修改字段如何反映到界面

? ? ? ? 因為容器的“修改”是添加和刪除,而字段的修改屬于容器里的每個對象,技術上是完全不同的。

一、添加和刪除如何反映到界面

? ? ? ? DataGrid通過ItemSource綁定到數據源,數據源要求是個IEnumerable,通常用List<>,然而,List<>并沒有變化通知的功能,因此我們之前用List<>無論如何都不能實現數據源添加修改反映到界面。

? ? ? ? 為了讓DataGrid能夠得到數據源變化通知,需要使用另一個模板:ObservableCollection<>。簡單替換之后數據源的增加和刪除就能立即反映到界面上了。

? ? ? ? 通過點擊按鈕給數據源增加數據:

			Data tmp = new Data("aa", "", "", "");datas.Add(tmp);datas[0].Dir = datas.Count.ToString();注意此句尚不會更新到界面datas[0].File = datas.Count.ToString();注意此句尚不會更新到界面

? ? ? ? 效果如下:?

? ? ? ? 注意,修改字段是不會反映上去的,即使隱藏控件然后再顯示也不行。但是如果數據很多發生了滾動,一條數據重新出現時會顯示為更新后的數據。(注:上圖是已經添加了字段變化通知的效果,第一行第一列第二列已經被修改)

二、修改界面如何反應到字段

2.1?INotifyPropertyChanged

? ? ? ? 能夠通知字段變化的數據類型必須支持INotifyPropertyChanged接口。該接口包含一個事件:

event PropertyChangedEventHandler PropertyChanged;

? ? ? ? 此事件在屬性更改時發生。實現此接口的數據類型需要在每個屬性更改是觸發此事件。?

2.2 實現INotifyPropertyChanged

? ? ? ? 實現過程相當繁瑣,C#在引入無數令人困惑的語法甜點之后,為什么不給加個關鍵字指示一下呢?

? ? ? ? 以下是新的Data類的代碼:

		public class Data : INotifyPropertyChanged{String _dir;String _file;public String Dir { get { return _dir; } set { _dir = value; OnPropertyChanged(); } }public String File { get { return _file; } set { _file = value; OnPropertyChanged(); } }public String Ext { get; set; } = "";public String Type { get; set; } = "";public String Encode { get; set; } = "";public String BOM { get; set; } = "";public int CR { get; set; } = 0;public int CRLF { get; set; } = 0;public int LF { get; set; } = 0;public String State { get; set; } = "";public event PropertyChangedEventHandler PropertyChanged = delegate { };public void OnPropertyChanged([CallerMemberName] string propertyName=""){// Raise the PropertyChanged event, passing the name of the property whose value has changed.PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));}public Data(String str, String n,String str2, String b){this.Dir = str;this.Ext = n;this.File = str2;this.State = b;}public static ObservableCollection<Data> Datas(){return new ObservableCollection<Data>(new Data[4] {new Data("a", "1","aaa","false"),new Data("b","2","bbb","false"),new Data("c", "3","ccc","true"),new Data("d", "4","ddd","true")});}}

? ? ? ? 定義INotifyPropertyChanged要求的事件:

			public event PropertyChangedEventHandler PropertyChanged = delegate { };

? ? ? ? 實現輔助的觸發時間函數,以簡化每個屬性的代碼:

			public void OnPropertyChanged([CallerMemberName] string propertyName=""){// Raise the PropertyChanged event, passing the name of the property whose value has changed.PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));}

? ? ? ? 一個屬性的實現:

			String _dir;public String Dir { get { return _dir; } set { _dir = value; OnPropertyChanged(); } }

? ? ? ? 我們還記得原來的寫法很簡單:

public String Dir { get; set; } = "";

?????????為什么復雜了這么多?

  • 因為要調用函數觸發事件,set必須寫出來
  • 因為set必須寫出來,就必須先給自己賦值
  • 在set里給自己賦值會觸發set,無限遞歸
  • 所以不能使用簡化屬性語法,必須額外定義一個實際變量
  • 因此get也必須寫出來

? ? ? ? 對每一個需要實時更新界面的屬性都要這樣寫。

三、xaml設置和代碼設置

? ? ? ? xaml可以設置Mode為單項或雙向,代碼設置ItemSource時沒有設置的地方,目前看至少是OneWay方式,是否支持雙向,我們以后再研究。


(這里是文檔結束)

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

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

相關文章

基于Python學習《Head First設計模式》第十三章 現實世界中的模式

定義設計模式 設計模式要素 模式名稱、分類意圖&#xff1a;描述模式是什么動機&#xff1a;描述什么時候使用這個模式&#xff0c;具體場景適用性&#xff1a;描述什么地方使用這個模式&#xff0c;用在什么場合結構&#xff1a;類圖參與者&#xff1a;類和對象的責任和角色…

線性代數(1)線性方程組的多種解法

求解線性方程組是線性代數的核心問題之一&#xff0c;根據方程組的類型&#xff08;如齊次/非齊次、方陣/非方陣、稀疏/稠密等&#xff09;&#xff0c;可以采用不同的解法。以下是常見的線性方程組解法分類及簡要說明&#xff1a; 一、直接解法&#xff08;精確解&#xff09…

肝臟/肝臟腫瘤圖像分割數據集(貓臉碼客第261期)

探秘肝臟/肝臟腫瘤圖像分割&#xff1a;醫學影像技術的新突破 一、引言 肝臟/肝臟腫瘤圖像分割在醫學領域占據著愈發重要的地位&#xff0c;為肝臟疾病的精準診斷與有效治療提供了關鍵技術支撐。隨著醫學成像技術的飛速進步&#xff0c;如磁共振成像&#xff08;MRI&#xff…

【LLM05---位置編碼】

文章目錄 位置編碼引出Transformer中位置編碼方法:Sinusoidal functions兩個重要性質位置編碼 最近在學習位置編碼,想找一個講的比較透徹的文章或視頻,找了半天,滿意的一個也沒有,所以自己記錄一下。 注意,本篇筆記只作為自己的學習記錄用,更好的講解的內容請看鏈接:位…

pikachu——ssrf

概念補充&#xff1a; 內網&#xff1a;局部范圍內的私有網絡&#xff0c;比如局域網就是一個小范圍的內網&#xff0c;有私有IP&#xff0c;并且內網受防火墻的保護&#xff0c;外網無法直接訪問 外網&#xff1a;全球范圍的公共網絡&#xff0c;公有ip ip地址&#xff1a;…

java 設計模式_行為型_13備忘錄模式

13.備忘錄模式 模式定義 備忘錄模式&#xff08;Memento Pattern&#xff09;模式的定義&#xff1a;在不破壞封裝性的前提下&#xff0c;捕獲一個對象的內部狀態&#xff0c;并在該對象之外保存這個狀態&#xff0c;以便以后當需要時能將該對象恢復到原先保存的狀態。該模式又…

創建postgres數據庫失敗

異常&#xff1a; postgres# CREATE DATABASE deepflow_agent2; ERROR: source database "template1" is being accessed by other users DETAIL: There are 2 other sessions using the database 如何斷聯這兩個session 要解決 PostgreSQL 中因 template1 數據庫…

臥安機器人闖上市:深耕AI具身技術,“大疆教父”李澤湘再落子

撰稿|行星 來源|貝多財經 又一家機器人企業&#xff0c;現身港股資本市場。貝多財經了解到&#xff0c;臥安機器人&#xff08;深圳&#xff09;股份有限公司&#xff08;下稱“臥安機器人”&#xff09;于6月8日向港交所提交了上市申請&#xff0c;國泰君安國際、華泰國際為…

基于GNU Radio Companion搭建的AM信號實驗

目錄 實驗目的和要求 1、AM收發系統仿真和實際接收 調制過程 2、Lab 2.1實驗過程AM信號的產生 AM信號的表達式 調制深度的概念 3、Lab2.2 AM信號的解調 4、Lab2.3 實際用RTLSDR接收一個ISM(912MHz)頻率的AM信號,信號的AM調制為音頻為48KHz的音樂信號 實驗目的和要求 …

【go】(僅思路)使用go實現一款簡單的關系型數據庫gosql

文章目錄 背景給navicate回復版本號建立連接數據庫list新建數據庫刪除數據庫刪除表查詢表數據總結roadmapnavicate連接適配 背景 使用go很容易編譯出一個二進制文件&#xff0c;已經有人用純go實現了sqlite3的驅動&#xff08;go get github.com/glebarez/sqlite&#xff09;&…

echarts開發 | 數據可視化 -- 第二篇 echart進階配置項學習

文章目錄 一、數據標記(markLine、markPoint)1.1 markLine&#xff08;標記線&#xff09;1.2 markPoint&#xff08;標記點&#xff09; 一、數據標記(markLine、markPoint) 支持兩類標記方式 markLine 和 markPoint 分別用于標示趨勢線和特定數據點&#xff0c;以加強數據表…

Kafka數據寫入流程源碼深度剖析(Broker篇)

在Kafka數據寫入流程中&#xff0c;Broker端負責接收客戶端發送的消息&#xff0c;并將其持久化存儲&#xff0c;是整個流程的關鍵環節。本文將深入Kafka Broker的源碼&#xff0c;詳細解析消息接收、處理和存儲的具體實現。 一、網絡請求接收與解析 Broker通過Processor線程…

名稱 深度學習(監督學習) Iteration 一次 mini-batch 前向+反向傳播更新 Epoch 所有數據集訓練一遍。這兩個概念不一樣嗎?

你的問題非常專業&#xff0c;確實容易混淆&#xff0c;下面我用科研術語 通俗比喻來清晰地區分&#xff1a; ? 簡明對照表&#xff1a;Iteration vs. Epoch&#xff08;在監督學習中&#xff09; 名稱專業術語解釋通俗理解是否屬于監督學習&#xff08;深度學習&#xff09…

Blender 模型下載

1.CGModel網站 https://www.cgmodel.com/ 免費模型數量多&#xff0c;國風類題材的模型多&#xff0c;中文搜索方便 2.Blender官網 3.3d溜溜網 https://3d.3d66.com/ 4.free3d.com free3d.com

Spring涉及的設計模式以及實際使用場景(含代碼)

Spring涉及的設計模式以及實際使用場景(含代碼) 1.工廠模式&#xff08;Factory Pattern&#xff09; 作用: 隱藏對象創建的細節&#xff0c;通過工廠類統一管理對象的實例化。 場景&#xff1a;Spring的BeanFactory和ApplicationContext是工廠模式的典型實現。 // 通過App…

ROM 只讀存儲器 隨機存取

ROM&#xff08;Read-Only Memory&#xff0c;只讀存儲器&#xff09;的存取方式為&#xff1a; ? 隨機存取方式&#xff08;Random Access&#xff09; 盡管“ROM”強調的是“只讀”&#xff0c;它的數據訪問方式與 RAM 類似&#xff0c;都是隨機存取。 &#x1f50d; 解釋如…

opensuse解決微信無法登錄的問題

思路啟發 https://forum.suse.org.cn/t/topic/17183/2 實際解決 https://forum.suse.org.cn/t/topic/17204/5 解決方法 先安裝 sudo zypper install execstackcd /opt/wechatsudo bash -c execstack -c ./*.so

Adixen ASM380 氦氣檢漏儀 阿爾卡特Mobile high performance helium leak detector

Adixen ASM380 氦氣檢漏儀 阿爾卡特Mobile high performance helium leak detector

堆的自動管理

由于程序員必須編寫出到分配和釋放存儲器的明確的調用&#xff0c;所以用m a l l o c和f r e e完成指針的動態分配和重新分配是管理堆的手工( m a n u a l )方法。相反地&#xff0c;運行時棧則是由調用序列自動地( a u t o m a t i c a l l y )管理。在一種需要完全動態的運行…

智能出入庫管理系統:自動化管控平臺

部隊裝備庫室智能管控系統是集智能化、集成化、網絡化于一體的綜合管理系統&#xff0c;由智慧營區庫室綜合管控平臺、出入口控制子系統、智能QD柜子系統、裝備物資管理子系統、視頻監控系統、入侵報警子系統、環境監測子系統等七大核心子系統構成。各子系統通過數據自動交互&a…