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

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 不是线程安全的,如果需要在多个线程中使用,需要进行额外的线程同步处理。

相关文章:

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

List和ObservableCollection和ListBinding在MVVM模式下的对比 List 当对List进行增删操作后&#xff0c;并不会对View进行通知。 //Employee public class Employee : INotifyPropertyChanged {public event PropertyChangedEventHandler? PropertyChanged;public string N…...

insightface安装过程中提示 Microsoft Visual C++ 14.0 or greater is required.

pip install insightface安装过程中提示 Microsoft Visual C 14.0 or greater is required.Get it with "Microsoft C Build Tools": https://visualstudio.microsoft.com/visual-cpp-build-tools/ 根据提示网站访问官网下载生成工具 打开软件后会自动更新环境&#…...

mongodb数据库

目录 一、数据库 二、文档 三、集合 四、元数据 五、MongoDB 数据类型 1、ObjectId 2、字符串 3、时间戳 4、日期 一、数据库 一个 mongodb 中可以建立多个数据库。 MongoDB 的默认数据库为"db"&#xff0c;该数据库存储在 data 目录中。 MongoDB 的单…...

OpenCV-Python中的图像处理-图像特征

OpenCV-Python中的图像处理-图像特征 图像特征Harris角点检测亚像素级精度的角点检测Shi-Tomasi角点检测SIFT(Scale-Invariant Feature Transfrom)SURF(Speeded-Up Robust Features)FAST算法BRIEF(Binary Robust Independent Elementary Features)算法ORB (Oriented FAST and R…...

Ajax入门+aixos+HTTP协议

一.Ajax入门 概念:AJAX是浏览器与服务器进行数据通信的技术 axios使用: 引入axios.js使用axios函数:传入配置对象,再用.then回调函数接受结果,并做后续处理 <!DOCTYPE html> <html><head><meta charset"utf-8"><title>01.axios使用…...

conda创建虚拟环境

创建虚拟环境是在计算机上设置一个独立的空间&#xff0c;用于安装和运行特定版本的软件和依赖项&#xff0c;以避免与系统其他部分的冲突。 创建虚拟环境&#xff1a; conda create --name myenv python3.8 这将创建一个名为myenv的虚拟环境&#xff0c;并安装Python 3.8版本。…...

Golang服务的请求调度

文章目录 1. 写在前面2. SheddingHandler的实现原理3. 相关方案的对比4. 小结 1. 写在前面 最近在看相关的Go服务的请求调度的时候&#xff0c;发现在gin中默认提供的中间件中&#xff0c;不含有请求调度相关的逻辑中间件&#xff0c;去github查看了一些服务框架&#xff0c;发…...

Jenkins的流水线启动jar后未执行问题处理

现象 在流水线里配置了启动脚本例如&#xff0c;nohup java -jar xxx.jar >nohup.out 2>&1 & 但是在服务器发现服务并未启动,且nohup日志里没输出日志,这样的原因是jenkins在执行完脚本后&#xff0c;就退出了这个进程。 在启动脚本执行jar命令的上一步加入以下…...

智慧工地平台工地人员管理系统 可视化大数据智能云平台源码

智慧工地概述&#xff1a; 智慧工地管理平台是以物联网、移动互联网技术为基础&#xff0c;充分应用大数据、人工智能、移动通讯、云计算等信息技术&#xff0c;利用前端信息采通过人机交互、感知、决策、执行和反馈等&#xff0c;实现对工程项目內人员、车辆、安全、设备、材…...

外包干了2个月测试,技术退步明显...

先说一下自己的情况&#xff0c;大专生&#xff0c;18年通过校招进入湖南某软件公司&#xff0c;干了接近4年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了四年的功能测试…...

神经网络基础-神经网络补充概念-19-向量化实现的解释

概念 向量化是一种优化技术&#xff0c;通过使用数组操作代替显式的循环&#xff0c;可以大大提高代码的性能和效率。在机器学习和数据分析领域&#xff0c;向量化是一种常见的实践&#xff0c;它允许你在处理大量数据时更快地进行计算。 一般操作 数组操作&#xff1a;向量…...

四层和七层负载均衡的区别

一、四层负载均衡 四层就是ISO参考模型中的第四层。四层负载均衡器也称为四层交换机&#xff0c;它主要时通过分析IP层和TCP/UDP层的流量实现的基于“IP端口”的负载均衡。常见的基于四层的负载均衡器有LVS、F5等。 以常见的TCP应用为例&#xff0c;负载均衡器在接收到第一个来…...

Scala 如何调试隐式转换--隐式转换代码的显示展示

方法1 在需要隐式转换的地方&#xff0c;把需要的参数显示的写出。 略方法2&#xff0c;查看编译代码 在terminal中 利用 scalac -Xprint:typer xxx.scala方法打印添加了隐式值的代码示例。 对于复杂的工程来说&#xff0c;直接跑到terminal执行 scalac -Xprint:typer xxx.…...

Rust交叉编译简述 —— Arm

使用系统&#xff1a;WSL2 —— Kali(Microsoft Store) 命令列表 rustup target list # 当前官方支持的构建目标架构列表 rustup target add aarch64-unknown-linux-gnu # 添加目标架构sudo apt-get install gcc-13-aarch64-linux-gnu gcc-13-aarch64-linux-gnu # 下载目标工具…...

算法与数据结构(二十三)动态规划设计:最长递增子序列

注&#xff1a;此文只在个人总结 labuladong 动态规划框架&#xff0c;仅限于学习交流&#xff0c;版权归原作者所有&#xff1b; 也许有读者看了前文 动态规划详解&#xff0c;学会了动态规划的套路&#xff1a;找到了问题的「状态」&#xff0c;明确了 dp 数组/函数的含义&a…...

相机的位姿在地固坐标系ECEF和ENU坐标系的转换

在地球科学和导航领域&#xff0c;通常使用地心地固坐标系&#xff08;ECEF&#xff0c;Earth-Centered, Earth-Fixed&#xff09;和东北天坐标系&#xff08;ENU&#xff0c;East-North-Up&#xff09;来描述地球上的位置和姿态。如下图所示&#xff1a; ​地心地固坐标ecef和…...

RFID技术助力汽车零配件装配产线,提升效率与准确性

随着科技的不断发展&#xff0c;越来越多的自动化设备被应用到汽车零配件装配产线中。其中&#xff0c;射频识别&#xff08;Radio Frequency Identification&#xff0c;简称RFID&#xff09;技术凭借其独特的优势&#xff0c;已经成为了这一领域的重要技术之一。本文将介绍RF…...

应用高分辨率 GAN 对扰动文档图像去扭曲的深度Python实践

1. 引言 随着技术的不断发展&#xff0c;图像处理在各种场景中的应用也变得越来越广泛。高分辨率 GAN (Generative Adversarial Network) 是近年来图像处理领域的热点技术&#xff0c;它能够生成极高分辨率的图像&#xff0c;与此同时&#xff0c;它也可以用于各种修复和增强任…...

【BASH】回顾与知识点梳理(二十六)

【BASH】回顾与知识点梳理 二十六 二十六. 二十一至二十五章知识点总结及练习26.1 总结26.2 模拟26.3 简答题 该系列目录 --> 【BASH】回顾与知识点梳理&#xff08;目录&#xff09; 二十六. 二十一至二十五章知识点总结及练习 26.1 总结 Linux 操作系统上面&#xff0c…...

React下载文件的两种方式

React下载文件的两种方式 - 代码先锋网 不知道有用没用看着挺整齐 没试过 1、GET类型下载 download url > {const eleLink document.createElement(a);eleLink.style.display none;// eleLink.target "_blank"eleLink.href url;// eleLink.href record;d…...

Kook Zimage真实幻想Turbo快速调试:找到属于你的幻想风格黄金参数组合

Kook Zimage真实幻想Turbo快速调试&#xff1a;找到属于你的幻想风格黄金参数组合 1. 认识Kook Zimage真实幻想Turbo Kook Zimage真实幻想Turbo是一款专为个人GPU设计的轻量化幻想风格图像生成系统。它基于Z-Image-Turbo极速文生图底座&#xff0c;通过独特的权重融合技术&am…...

Wan2.2-I2V-A14B与数据库联动:自动化生成电商商品动态详情页视频

Wan2.2-I2V-A14B与数据库联动&#xff1a;自动化生成电商商品动态详情页视频 1. 电商视频制作的痛点与机遇 电商平台每天都有大量新品上架&#xff0c;传统的商品详情页视频制作方式面临巨大挑战。一个中型电商平台每月可能新增上千款商品&#xff0c;如果每款商品都需要人工…...

OpenClaw自动化写作助手:基于GLM-4.7-Flash的草稿生成与润色

OpenClaw自动化写作助手&#xff1a;基于GLM-4.7-Flash的草稿生成与润色 1. 为什么需要自动化写作助手 作为一个长期与文字打交道的内容创作者&#xff0c;我经常面临这样的困境&#xff1a;明明有好的选题灵感&#xff0c;却卡在初稿阶段耗费大量时间&#xff1b;或是写完后…...

OpenClaw安全实践:GLM-4.7-Flash本地化部署的权限控制指南

OpenClaw安全实践&#xff1a;GLM-4.7-Flash本地化部署的权限控制指南 1. 为什么需要关注OpenClaw的权限控制&#xff1f; 去年夏天&#xff0c;我在整理电脑上的财务报告时&#xff0c;无意中发现OpenClaw自动将我的税务文件同步到了一个陌生目录。这个意外让我意识到——当…...

OpenClaw极简部署:Qwen3-VL:30B镜像+飞书5分钟接入

OpenClaw极简部署&#xff1a;Qwen3-VL:30B镜像飞书5分钟接入 1. 为什么选择这个组合&#xff1f; 上周我在测试各种开源模型与自动化工具的搭配方案时&#xff0c;发现了一个效率极高的组合&#xff1a;星图平台的Qwen3-VL:30B镜像OpenClaw框架。这个方案最吸引我的地方在于…...

LangGPT:革新自然语言编程的结构化提示词框架

LangGPT&#xff1a;革新自然语言编程的结构化提示词框架 【免费下载链接】LangGPT LangGPT: Empowering everyone to become a prompt expert!&#x1f680; Structured Prompt&#xff0c;Language of GPT, 结构化提示词&#xff0c;结构化Prompt 项目地址: https://gitcod…...

等保测评必看!用组策略批量关闭445/139端口(域环境适用版)

企业域环境下批量关闭高危端口的组策略实战指南 在等保测评和日常安全运维中&#xff0c;445、139、135等端口因其历史漏洞和潜在风险&#xff0c;常被列为必须管控的高危端口。对于拥有数百甚至上千台终端的中大型企业来说&#xff0c;逐台手动配置不仅效率低下&#xff0c;更…...

售前客户需求深度挖掘:从表面诉求到核心痛点的五步法

# 003、客户需求深度挖掘&#xff1a;从表面诉求到核心痛点的五步法---上周调一个嵌入式项目&#xff0c;客户说“设备偶尔会死机&#xff0c;重启就好”。我们查了三天的日志&#xff0c;发现是内存泄漏。但真正的问题是什么&#xff1f;是代码质量&#xff1f;不完全是。最后…...

浒浦潮汐表查询2026-03-28

位置&#xff1a;浒浦&#xff0c;日期&#xff1a;2026-03-28&#xff0c;农历&#xff1a;丙午[马]年二月初十&#xff0c;星期&#xff1a;星期六&#xff0c;潮汐类型&#xff1a;小潮死汛最高水位&#xff1a;275.00cm&#xff0c;最低水位&#xff1a;122.00cm&#xff0…...

大模型私有化不是选型,是生存!Python工程师必须在Q3前掌握的5类国产化适配方案,否则明年项目全卡审批

第一章&#xff1a;大模型私有化是Python工程师的生存分水岭当企业开始将大语言模型从公有云API转向本地GPU集群部署&#xff0c;Python工程师的角色正经历一次静默但深刻的重构——不再只是调用requests.post()封装接口&#xff0c;而是要亲手构建模型加载、推理服务、权限控制…...