List和ObservableCollection和ListBinding在MVVM模式下的對比

List和ObservableCollection和ListBinding在MVVM模式下的對比

List

當對List進行增刪操作后,并不會對View進行通知。

//Employee
public class Employee : INotifyPropertyChanged
{public event PropertyChangedEventHandler? PropertyChanged;public string Name { get; set; }private int salary;public int Salary{get { return salary; }set{salary = value;PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(Salary)));}}
}
<!--View-->
<Grid><Grid.RowDefinitions><RowDefinition /><RowDefinition Height="40" /></Grid.RowDefinitions><DataGrid ItemsSource="{Binding Employees}" /><StackPanelGrid.Row="1"VerticalAlignment="Center"Orientation="Horizontal"><Button Command="{Binding addCommand}" Content="Add" /><TextBlock Text="工資總額" /><TextBox Text="{Binding TotalSalary, Mode=OneWay}" /></StackPanel>
</Grid>
//MainViewModel
public partial class MainViewModel:INotifyPropertyChanged
{public List<Employee> Employees { get; }public int TotalSalary=>Employees.Sum(x => x.Salary);public MainViewModel(){Employees = new List<Employee>() { new Employee(){Name="Tom",Salary=200},new Employee(){Name="Tim",Salary=450},new Employee(){Name="Jerry",Salary=780},new Employee(){Name="Jake",Salary=540},new Employee(){Name="Kit",Salary=670},};}[RelayCommand]private void add(){Employees.Add(new Employee() {  Name = "Lit", Salary = 260 });//通知TotalSalayPropertyChanged?.Invoke(this,new PropertyChangedEventArgs(nameof(TotalSalary)));}public event PropertyChangedEventHandler? PropertyChanged;
}

334

可以看到,點擊Add后,上面列表中并沒有更新,但是工資總額已經更新,這說明新的數據已經加到了List中,但是List并沒有通知View。

ObservableCollection

  • ObservableCollection可以在增加和刪除時,對View進行通知

    修改MainViewModel

    public partial class MainViewModel:INotifyPropertyChanged
    {public ObservableCollection<Employee> Employees { get; }public int TotalSalary=>Employees.Sum(x => x.Salary);public MainViewModel(){Employees = new ObservableCollection<Employee>() { new Employee(){Name="Tom",Salary=200},new Employee(){Name="Tim",Salary=450},new Employee(){Name="Jerry",Salary=780},new Employee(){Name="Jake",Salary=540},new Employee(){Name="Kit",Salary=670},};}[RelayCommand]private void add(){Employees.Add(new Employee() {  Name = "Lit", Salary = 260 });PropertyChanged?.Invoke(this,new PropertyChangedEventArgs(nameof(TotalSalary)));}//增加一個Modify方法[RelayCommand]private void Modify(){Employees[2].Salary = 999;PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(TotalSalary)));}public event PropertyChangedEventHandler? PropertyChanged;
    }
    

    335

    可以發現,點擊Add,View中也相應地進行了更新,而且工資總額也相應改變。同時,無論是add還是Modify,都使用了PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(TotalSalary)));它的改進做法是使用CollectionChanged事件。

//改進做法,增加CollectionChanged,可以刪除add()和Modify()的PropertyChanged...了
Employees.CollectionChanged += (_, _) => { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(TotalSalary))); };

BindingList

BindingList提供了更多的功能,提供了排序、搜索、過濾等功能。此外,BindingList 還提供了對數據源的更多控制,如 AllowNew、AllowEdit 和 AllowRemove 屬性,用于控制是否允許添加、編輯和刪除項。

BindingList提供了ListChanged事件,該事件參數中提供了詳細的信息,但是ObservableCollection 是線程安全的,可以在多個線程中使用。而 BindingList 不是線程安全的,如果需要在多個線程中使用,需要進行額外的線程同步處理。

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

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

相關文章

Vue-13.創建完整的Vue項目(vue+vue-cli+js)

前言 之前寫了命令創建Vue項目&#xff0c;但是事實上我們可以直接用編譯器直接創建項目&#xff0c;這里我使用webstorm&#xff08;因為我是前后端兼修的所以我習慣使用Idea家族的編譯器&#xff09; 只寫前端的推薦用VsCode前后端都寫的推薦用webstorm 新建項目 項目初始…

確保Django項目的穩定運行和持續改進

確保Django項目的穩定運行和持續改進 引言 Django是一個強大的Python Web框架&#xff0c;用于構建高效、可靠的Web應用程序。然而&#xff0c;部署一個Django項目并不意味著工作已經完成。在項目上線之后&#xff0c;確保項目的穩定運行并不斷進行改進是非常重要的。本博客將…

vscode 安裝勾選項解釋

1、通過code 打開“操作添加到windows資源管理器文件上下文菜單 &#xff1a;把這個兩個勾選上&#xff0c;可以對文件使用鼠標右鍵&#xff0c;選擇VSCode 打開。 2、將code注冊為受支持的文件類型的編輯器&#xff1a;不建議勾選&#xff0c;這樣會默認使用VSCode打開支持的相…

《Linux從練氣到飛升》No.15 Linux 環境變量

&#x1f57a;作者&#xff1a; 主頁 我的專欄C語言從0到1探秘C數據結構從0到1探秘Linux菜鳥刷題集 &#x1f618;歡迎關注&#xff1a;&#x1f44d;點贊&#x1f64c;收藏??留言 &#x1f3c7;碼字不易&#xff0c;你的&#x1f44d;點贊&#x1f64c;收藏??關注對我真的…

微信小程序通用字體代碼

下面是一個簡單的微信小程序通用字體代碼示例&#xff1a; // 在app.wxss中設置全局字體樣式 import ./styles/fonts.wxss;// 在fonts.wxss中定義字體樣式 font-face {font-family: CustomFont;src: url(font.ttf) format(truetype); }// 在page.wxss中使用自定義字體樣式 .cus…

SASS 學習筆記 II

SASS 學習筆記 II 上篇筆記&#xff0c;SASS 學習筆記 中包含&#xff1a; 配置 變量 嵌套 這里加一個擴展&#xff0c;嵌套中有一個 & 的用法&#xff0c;使用 & 可以指代當前 block 中的 selector&#xff0c;后面可以追加其他的選擇器。如當前的 scope 是 form&a…

GuLi商城-前端基礎Vue-使用Vue腳手架進行模塊化開發

自己親自實踐&#xff1a; mac安裝webpack webpack 簡介Webpack 是一個非常流行的前端構建工具&#xff0c;它可以將多個模塊&#xff08;包括CSS、JavaScript、圖片等&#xff09;打包成一個或多個靜態資源文件&#xff08;bundle&#xff09;&#xff0c;以便用于部署到生產…

19c_ogg搭建

1.環境介紹 源端&#xff1a;192.168.56.101 目標端&#xff1a;192.168.56.100 背景&#xff1a;數據從主庫cdb主機定位&#xff0c;同步到從庫 2.配置ogg 2.1 開啟歸檔、強制日志、補充日志 --ogg 主備都需要配置 SQL> alter database archivelog; SQL> alter databa…

【Axure高保真原型】JS日期選擇器篩選中繼器表格

今天和大家分享JS日期選擇器篩選中繼器表格的原型模板&#xff0c;通過調用瀏覽器的日期選擇器&#xff0c;所以可以獲取真實的日歷效果&#xff0c;具體包括哪一年二月份有29天&#xff0c;幾號對應星期幾&#xff0c;都是真實的&#xff0c;獲取日期值后&#xff0c;通過交互…

接口測試,負載測試,并發測試,壓力測試區別

接口測試 1.定義&#xff1a;接口測試是測試系統組件間接口的一種測試。接口測試主要用于檢測外部系統與系統之間以及內部各個子系統之間的交互點。測試的重點是要檢查數據的交換&#xff0c;傳遞和控制管理過程&#xff0c;以及系統間的相互邏輯依賴關系等。 2.目的&#xf…

原型與繼承

原型與繼承 在 JavaScript 中&#xff0c;對象有一個特殊的隱藏屬性 [[Prototype]]&#xff08;如規范中所命名的&#xff09;&#xff0c;它要么為 null&#xff0c;要么就是對另一個對象的引用。該對象被稱為“原型。 當我們從 object 中讀取一個缺失的屬性時&#xff0c;Jav…

使用Julia實現A*路徑尋找算法:一個深入的指南

第一部分&#xff1a;簡介與背景 1. 引言 Julia&#xff0c;作為一種高效、靈活且易于學習的編程語言&#xff0c;逐漸在科學計算、數據分析和機器學習等領域中占據一席之地。當我們談到路徑規劃或游戲開發時&#xff0c;A_算法&#xff08;A Star Algorithm&#xff09;常常…

什么是變量提升(hoisting)?它在JavaScript中是如何工作的?

聚沙成塔每天進步一點點 ? 專欄簡介? 變量提升&#xff08;Hoisting&#xff09;? 變量提升的示例&#xff1a;? 寫在最后 ? 專欄簡介 前端入門之旅&#xff1a;探索Web開發的奇妙世界 記得點擊上方或者右側鏈接訂閱本專欄哦 幾何帶你啟航前端之旅 歡迎來到前端入門之旅&…

7.3 C/C++ 實現順序棧

順序棧是一種基于數組實現的棧結構&#xff0c;它的數據元素存儲在一段連續的內存空間中。在順序棧中&#xff0c;棧頂元素的下標是固定的&#xff0c;而棧底元素的下標則隨著入棧和出棧操作的進行而變化。通常&#xff0c;我們把棧底位置設置在數組空間的起始處&#xff0c;這…

C++11并發與多線程筆記(9) async、future、packaged_task、promise

C11并發與多線程筆記&#xff08;9&#xff09; async、future、packaged_task、promise 1、std::async、std::future創建后臺任務并返回值2、std::packaged_task&#xff1a;打包任務&#xff0c;把任務包裝起來3、std::promise3、小結 1、std::async、std::future創建后臺任務…

C++友元函數和友元類

友元 1.友元介紹2.類友元2.1示例代碼 3.函數友元3.1示例代碼 4.總結 1.友元介紹 在C中&#xff0c;友元&#xff08;friend&#xff09;是一種機制&#xff0c;允許某個類或函數訪問其他類的私有成員。通過友元&#xff0c;可以授予其他類或函數對該類的私有成員的訪問權限。友…

哈工大開源“活字”對話大模型

一、介紹 大規模語言模型&#xff08;LLM&#xff09;在自然語言處理的通用領域已取得了令人矚目的成功。對于廣泛的應用場景&#xff0c;這種技術展示了強大的潛力&#xff0c;學術界和工業界的興趣也持續升溫。哈工大自然語言處理研究所30余位老師和學生參與開發了通用對話大…

re學習(35)攻防世界-no-strings-attached(動調)

參考文章&#xff1a;re學習筆記&#xff08;28&#xff09;攻防世界-re-no-strings-attached_Forgo7ten的博客-CSDN博客 攻防世界逆向入門題之no-strings-attached_攻防世界 no-strings-attached_沐一 林的博客-CSDN博客 本人題解&#xff1a; 扔入Exepeinfo中查殼和其他信息…

LVS-DR模型實例

一、LVS-DR集群介紹 LVS-DR&#xff08;Linux Virtual Server Director Server&#xff09;工作模式&#xff0c;是生產環境中最常用的一 種工作模式。 1、LVS-DR 工作原理 LVS-DR 模式&#xff0c;Director Server 作為群集的訪問入口&#xff0c;不作為網關使用&#xff0…

python+django+mysql項目實踐五(信息搜索)

python項目實踐 環境說明: Pycharm 開發環境 Django 前端 MySQL 數據庫 Navicat 數據庫管理 信息搜素 輸入內容進行搜索,內容有文本類和時間類 文本類需要模糊搜索,包含即檢索 時間類需要選取時間范圍內的內容 views 利用Q完成對指定內容的檢索 檢索后按檢索內容更新…