在winform中實(shí)現(xiàn)雙向數(shù)據(jù)綁定的方法
什么是雙向數(shù)據(jù)綁定?
雙向數(shù)據(jù)綁定是一種允許我們創(chuàng)建持久連接的技術(shù),使模型數(shù)據(jù)和用戶界面(UI)之間的交互能夠自動(dòng)同步。這意味著當(dāng)模型數(shù)據(jù)發(fā)生變化時(shí),UI會(huì)自動(dòng)更新,反之亦然。這種雙向數(shù)據(jù)綁定極大地簡(jiǎn)化了UI和模型數(shù)據(jù)之間的同步,使開(kāi)發(fā)者可以更專注于業(yè)務(wù)邏輯,而不是手動(dòng)處理UI和數(shù)據(jù)的同步。
今天我想通過(guò)winform中DataGridView控件為例,介紹在winform中如何實(shí)現(xiàn)雙向數(shù)據(jù)綁定。
一般在winform中使用DataGridView控件時(shí),我們可能是這樣使用的:
創(chuàng)建數(shù)據(jù)源
以Person類為例:
public class Person { public string? Name { get; set; } public string? Home { get; set; } }
創(chuàng)建Person對(duì)象列表:
// 創(chuàng)建一個(gè)Person對(duì)象的列表 List<Person> people = new List<Person>() { new Person {Name = "張三",Home = "武漢" }, new Person {Name = "李四",Home = "南昌" }, new Person {Name = "王五",Home = "福州" }, };
綁定數(shù)據(jù)源:
dataGridView1.DataSource = people;
這個(gè)時(shí)候的效果如下所示:
當(dāng)我們進(jìn)行修改之后,如下所示:
現(xiàn)在打印people列表第一個(gè)和第二個(gè)person對(duì)象的Home屬性值看看:
Debug.WriteLine(people[0].Home); Debug.WriteLine(people[1].Home);
結(jié)果如下圖所示:
說(shuō)明在dataGridView1
上修改數(shù)據(jù),people列表也被修改了。
現(xiàn)在反過(guò)來(lái)測(cè)試一下,修改people列表第一個(gè)和第二個(gè)person對(duì)象的Home屬性值:
people[0].Home = "廈門"; people[1].Home = "廈門";
會(huì)發(fā)現(xiàn)dataGridView1
上的數(shù)據(jù)不會(huì)發(fā)生變化,需要我們點(diǎn)擊對(duì)應(yīng)的空格之后才會(huì)發(fā)生改變,如下所示:
如果我們這樣寫(xiě)的話:
people[0].Home = "廈門"; people[1].Home = "廈門"; dataGridView1.UpdateCellValue(1,1); dataGridView1.UpdateCellValue(1,2);
效果如下所示:
只改變了一個(gè)空格的值,另一個(gè)還是需要點(diǎn)擊一下,才更新。
在winform中實(shí)現(xiàn)雙向數(shù)據(jù)綁定示例
首先創(chuàng)建一個(gè)Student
類,如下所示:
public class Student : INotifyPropertyChanged { private string? _name; ? public string Name { get { return _name; } set { _name = value; // Call OnPropertyChanged whenever the property is updated OnPropertyChanged("Name"); } } private string? _home; ? public string Home { get { return _home; } set { _home = value; // Call OnPropertyChanged whenever the property is updated OnPropertyChanged("Home"); } } ? // Declare the event public event PropertyChangedEventHandler? PropertyChanged; // Create the OnPropertyChanged method to raise the event protected void OnPropertyChanged(string name) { var handler = PropertyChanged; handler?.Invoke(this, new PropertyChangedEventArgs(name)); } }
實(shí)現(xiàn)了INotifyPropertyChanged
接口。
創(chuàng)建數(shù)據(jù)源:
// 創(chuàng)建一個(gè)Student對(duì)象的列表 BindingList<Student> students = new BindingList<Student>() { new Student { Name = "張三", Home = "武漢" }, new Student { Name = "李四", Home = "南昌" }, new Student { Name = "王五", Home = "福州" }, };
注意這里使用的是BindingList<T>
而不是List<T>
。
BindingList<T>
與List<T>
的區(qū)別
BindingList 和 List 都是用于存儲(chǔ)對(duì)象的集合,但它們之間有一些關(guān)鍵的區(qū)別。
- 數(shù)據(jù)綁定支持:BindingList 是為數(shù)據(jù)綁定設(shè)計(jì)的,它實(shí)現(xiàn)了 IBindingList 接口。這意味著當(dāng) BindingList 中的數(shù)據(jù)發(fā)生更改時(shí)(例如,添加、刪除或修改項(xiàng)),它會(huì)自動(dòng)通知綁定到它的任何 UI 控件。這對(duì)于 Windows Forms 或 WPF 這樣的 UI 框架非常有用,因?yàn)樗鼈兛梢宰詣?dòng)更新以反映數(shù)據(jù)的更改。相比之下,List 不支持?jǐn)?shù)據(jù)綁定。
- 事件通知:BindingList 提供了一些額外的事件,如 ListChanged,這可以讓你知道列表何時(shí)被修改。List 沒(méi)有這樣的事件。
- 性能:由于 BindingList 提供了額外的功能,所以在某些情況下,它可能比 List 慢一些。如果你不需要數(shù)據(jù)綁定或更改通知,那么 List 可能會(huì)提供更好的性能。
綁定數(shù)據(jù)源:
dataGridView1.DataSource = students;
更改數(shù)據(jù)源的值,查看UI是否會(huì)自動(dòng)改變:
students[0].Home = "廈門"; students[1].Home = "廈門";
實(shí)現(xiàn)的效果如下所示:
發(fā)現(xiàn)當(dāng)數(shù)據(jù)的值發(fā)生改變時(shí),dataGridView1
會(huì)自動(dòng)進(jìn)行更新。
編輯dataGridView1
查看數(shù)據(jù)源是否會(huì)發(fā)生改變,編輯之后如下圖所示:
查看結(jié)果:
Debug.WriteLine(students[0].Home); Debug.WriteLine(students[1].Home);
結(jié)果如下圖所示:
說(shuō)明編輯dataGridView1
產(chǎn)生的更改也會(huì)導(dǎo)致數(shù)據(jù)源的更改。
總結(jié)
以上就是在winform中實(shí)現(xiàn)雙向數(shù)據(jù)綁定的一次實(shí)踐,要點(diǎn)有兩個(gè),第一個(gè)是類實(shí)現(xiàn)INotifyPropertyChanged
,第二個(gè)是用BindingList<T>
代替List<T>
,希望對(duì)你有所幫助。
到此這篇關(guān)于在winform中實(shí)現(xiàn)雙向數(shù)據(jù)綁定的方法的文章就介紹到這了,更多相關(guān)winform雙向綁定數(shù)據(jù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C# 讀取ttf字體文件里的Unicode實(shí)現(xiàn)
這篇文章主要介紹了C# 讀取 ttf字體文件里的 Unicode實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09C#利用WinForm實(shí)現(xiàn)查看指定目錄下所有圖片功能
Windows 窗體是用于生成 Windows 桌面應(yīng)用的 UI 框架, 它提供了一種基于 Visual Studio 中提供的可視化設(shè)計(jì)器創(chuàng)建桌面應(yīng)用的高效方法,本文介紹了C#利用WinForm實(shí)現(xiàn)可以查看指定目錄文件下所有圖片功能,需要的朋友可以參考下2024-05-05對(duì)int array進(jìn)行排序的實(shí)例講解
下面小編就為大家分享一篇對(duì)int array進(jìn)行排序的實(shí)例講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2017-12-12C#畫(huà)筆使用復(fù)合數(shù)組繪制單個(gè)矩形的方法
這篇文章主要介紹了C#畫(huà)筆使用復(fù)合數(shù)組繪制單個(gè)矩形的方法,涉及C#使用畫(huà)筆繪制圖形的相關(guān)技巧,需要的朋友可以參考下2015-06-06C#使用Automation實(shí)現(xiàn)控制自動(dòng)撥打接聽(tīng)電話
這篇文章主要為大家詳細(xì)介紹了C#如何使用Automation實(shí)現(xiàn)控制自動(dòng)撥打接聽(tīng)電話,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-02-02淺談Async和Await如何簡(jiǎn)化異步編程(幾個(gè)實(shí)例讓你徹底明白)
本篇文章主要介紹了淺談Async和Await如何簡(jiǎn)化異步編程,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-12-12C#實(shí)現(xiàn)最簡(jiǎn)單的文本加密方法
這篇文章主要介紹了C#實(shí)現(xiàn)最簡(jiǎn)單的文本加密方法,可實(shí)現(xiàn)簡(jiǎn)單的文本加密功能,是非常實(shí)用的技巧,需要的朋友可以參考下2014-12-12