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

C#中的BindingList有什么作用?

在C#中,BindingList<T> 是一个非常重要的集合类,位于 System.ComponentModel 命名空间,主要用于实现数据绑定(Data Binding)场景。

1. 核心作用

BindingList<T> 是 List<T> 的增强版,主要提供以下功能:

  • 自动通知UI更新:当集合内容变化(增删改)时,自动触发事件通知绑定控件(如DataGridView、ListBox等)刷新显示。

  • 支持双向数据绑定:简化UI控件与数据集合的同步,无需手动编写刷新逻辑。

  • 扩展的事件支持:比普通 List<T> 提供更多细粒度的事件(如 AddingNewListChanged)。

 

2. 关键特性

(1) 自动触发UI更新
BindingList<string> names = new BindingList<string>();
dataGridView1.DataSource = names; // 绑定到DataGridViewnames.Add("Alice"); // 添加项时,DataGridView会自动更新显示
names.RemoveAt(0);  // 删除项时,UI同步更新

 

(2) 丰富的事件
事件触发时机
ListChanged列表内容或结构变化时(增删改排序等)
AddingNew添加新项之前
AddingNew添加新项之前

 

names.ListChanged += (sender, e) => 
{Console.WriteLine($"列表已更改,类型: {e.ListChangedType}");
};

 

(3) 支持编辑通知

若 T 实现 INotifyPropertyChanged,项属性修改时也会通知UI:

public class Person : INotifyPropertyChanged
{private string _name;public string Name{get => _name;set { _name = value; OnPropertyChanged(nameof(Name)); }}public event PropertyChangedEventHandler? PropertyChanged;protected void OnPropertyChanged(string propertyName) =>PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}// 使用
BindingList<Person> people = new BindingList<Person>();
dataGridView1.DataSource = people;people.Add(new Person { Name = "Bob" });
people[0].Name = "Alice"; // 修改属性时,UI自动更新!

 

3. 典型使用场景

(1) WinForms/WPF数据绑定
// WinForms示例
BindingList<Product> products = new BindingList<Product>();
dataGridView1.DataSource = products;// WPF示例(需配合ObservableCollection,但BindingList在某些场景仍有用)
listBox.ItemsSource = products;

 (2) 实时监控集合变化

var logs = new BindingList<string>();
logs.ListChanged += (s, e) => Console.WriteLine($"日志变更: {logs[e.NewIndex]}");
logs.Add("系统启动"); // 触发事件

4. 注意事项

  1. 性能:频繁大规模更新时,考虑使用 ResetItems 通知而非逐项更新。

  2. 线程安全:需通过 Invoke 在UI线程操作(与所有控件交互一样)。

  3. WPF优先用 ObservableCollection<T>BindingList 主要面向WinForms设计。

http://www.lryc.cn/news/582117.html

相关文章:

  • 【机器学习深度学习】多分类评估策略:混淆矩阵计算场景模拟示例
  • 亚马逊运营进阶指南:如何用AI工具赋能广告运营
  • 诊断工程师进阶篇 --- 车载诊断怎么与时俱进?
  • English Practice - Day 2
  • vite打包的简单配置
  • react状态管理库 - zustand
  • 风电自动化发电中的通信桥梁:CAN主站转MODBUS TCP网关解析
  • 【MyBatis】MyBatis与Spring和Spring Boot整合原理
  • 5种方法将联系人从iPhone转移到OnePlus
  • C++--map和set的使用
  • 仿mudou库one thread oneloop式并发服务器
  • 达梦数据库的信息查询
  • Redisson 分布式锁原理解析
  • Navicat Premium可视化工具使用查询控制台优化SQL语句
  • 商品中心—库存分桶高并发的优化文档
  • 力扣 3258 统计满足 K 约束的子字符串数量 I 题解
  • Java工具类,对象List提取某个属性为List,对象List转为对象Map其中某个属性作为Key值
  • RAG实战指南 Day 8:PDF、Word和HTML文档解析实战
  • UI自动化常见面试题
  • day08-Elasticsearch
  • 云计算领域“XaaS”是什么?
  • Python编译器(Pycharm Jupyter)
  • 第4.2节 Android App生成追溯关系
  • 【Mac 从 0 到 1 保姆级配置教程 19】- 英语学习篇-我的英语工作流分享(AI 辅助学习)
  • JavaWeb笔记07
  • 比亚迪6月销量38.25万辆,同比增长11.9%
  • window显示驱动开发—BGRA 扫描输出支持
  • 特伦斯T1节拍器,突出综合优势与用户体验
  • Python 包管理工具 uv
  • 【C语言进阶】数据是如何存储的?