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

WPF中BindingList<T>和List<T>

BindingList<T>List<T> 都是 C# 中用于存储集合数据的类,但它们的设计目标和功能有显著区别,核心差异体现在 数据绑定支持事件通知机制 上。以下是具体对比:

1. 核心定位与设计目的

  • List<T>
    最基础的泛型集合类,属于 System.Collections.Generic 命名空间,主要用于 高效存储和操作数据(如增删改查),不具备数据绑定相关功能。
    适合纯数据存储场景,不关心数据变化是否需要被外部感知。

  • BindingList<T>
    继承自 Collection<T> 并实现 IBindingList 接口,属于 System.ComponentModel 命名空间,专为 数据绑定场景设计
    当集合中的数据发生变化(新增、删除、修改元素)时,会自动触发事件通知,让绑定的 UI 控件(如 WPF 的 DataGridListBox)实时更新。

2. 关键功能差异

(1)数据变化通知机制
  • List<T>
    对数据的修改(如 AddRemoveClear)不会触发任何事件。如果将 List<T> 绑定到 UI 控件,修改集合后 UI 不会自动更新,需要手动刷新(如调用 INotifyPropertyChanged 相关方法)。

  • BindingList<T>
    内置事件通知机制,当集合发生变化时,会自动触发 ListChanged 事件(包含变化类型:新增、删除、元素修改等)。绑定的 UI 控件会监听该事件,自动同步更新,无需手动干预。

    示例
    当给 BindingList<T> 添加元素时,UI 会立即显示新元素;而 List<T> 添加元素后,UI 仍保持原样。

(2)元素属性变化感知
  • List<T>
    即使集合中的元素实现了 INotifyPropertyChanged 接口(用于通知属性变化),List<T> 本身也不会处理这些通知,UI 无法感知元素内部属性的修改。

  • BindingList<T>
    若集合中的元素实现了 INotifyPropertyChangedBindingList<T> 会自动监听元素的 PropertyChanged 事件,并将其转换为 ListChanged 事件传递给 UI,实现元素属性修改的实时同步。

    示例
    Person 类实现 INotifyPropertyChanged,当 BindingList<Person> 中某个 PersonName 属性修改时,绑定的 TextBox 会立即显示新名称;而 List<Person> 则不会。

(3)额外的数据绑定特性

BindingList<T> 还提供了专为数据绑定设计的功能:

  • 排序和筛选:支持通过 AllowSortingSortProperty 实现简单排序;通过 Filter 属性实现筛选(需配合 SupportsFiltering)。
  • 批量更新控制:通过 RaiseListChangedEvents 属性临时关闭事件通知,批量操作后再开启,减少 UI 频繁刷新。
  • 索引访问通知:通过 SetItem 方法修改元素时,会触发 ListChanged 事件(List<T>this[index] 赋值不会)。

3. 性能与适用场景

  • List<T>
    性能更优(因为无需处理事件通知),适合 非 UI 绑定场景,如后台数据处理、算法实现等纯数据存储需求。

  • BindingList<T>
    因事件通知机制会带来少量性能开销,但在 UI 数据绑定场景(如 WPF、WinForms)中是首选,能极大简化“数据-UI 同步”逻辑。

4. 代码示例对比

(1)List<T> 的问题(UI 不自动更新)
var list = new List<Person> { new Person("张三") };
dataGrid.ItemsSource = list;// 新增元素后,UI 不会更新
list.Add(new Person("李四")); 
(2)BindingList<T> 的自动更新
var bindingList = new BindingList<Person> { new Person("张三") };
dataGrid.ItemsSource = bindingList;// 新增元素后,UI 自动显示“李四”
bindingList.Add(new Person("李四")); 
(3)元素属性变化的同步(需 Person 实现 INotifyPropertyChanged
public class Person : INotifyPropertyChanged
{private string _name;public string Name { get => _name; set { _name = value;PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(Name)));} }// 构造函数和事件接口实现...
}// 修改元素属性后,UI 自动更新
bindingList[0].Name = "张三(修改后)"; // DataGrid 中对应行的名称会立即变化

总结

  • 若需 UI 数据绑定 且希望数据变化自动同步到界面,用 BindingList<T>
  • 若仅需 高效存储和操作数据,无需 UI 交互或事件通知,用 List<T>

在 WPF 开发中,BindingList<T> 是连接数据层和 UI 层的常用工具,尤其适合需要实时展示和编辑数据的场景(如数据表格、列表编辑)。

http://www.xdnf.cn/news/18105.html

相关文章:

  • Conda技巧:修改Conda环境目录,节省系统盘空间
  • 学习:各种不同类型的for循环遍历,forEach/map/filter/every/some/includes/reduce的详细用法(1)
  • 【项目】分布式Json-RPC框架 - 项目介绍与前置知识准备
  • [Linux]学习笔记系列 --[mm][list_lru]
  • Redis-缓存-穿透-布隆过滤器
  • 测试Windows10IoT系统是否可以正常运行KingSCSDA3.8软件
  • Transformer架构的数学本质:从注意力机制到大模型时代的技术内核
  • 蓝凌EKP产品:JSP 性能优化和 JSTL/EL要点检查列表
  • Excel 表格数据自动填充
  • C语言私人学习笔记分享
  • Canny边缘检测
  • pyecharts可视化图表组合组件_Grid:打造专业数据仪表盘
  • python pandas库 series如何使用
  • 电脑上搭建HTTP服务器在局域网内其它客户端无法访问的解决方案
  • 【Tech Arch】Hive技术解析:大数据仓库的SQL桥梁
  • 【从零开始学习Redis】项目实战-黑马点评D2
  • Conda 环境 在AI 私有化部署 有怎么用?
  • 迅速掌握Git通用指令
  • C++内存模型
  • 数据结构代码分享-1 顺序表
  • Redis面试精讲 Day 23:Redis与数据库数据一致性保障
  • Python 设计模式详解 —— 掌握软件设计的通用解决方案
  • 常用的SQL语句
  • ReactNode 类型
  • Java学习笔记:IDEA简单使用技巧
  • 使用vscode的task.json来自动执行make命令,而不直接使用终端
  • Eclipse Tomcat Configuration
  • 基于Python的旅游推荐系统 Python+Django+Vue.js
  • 【抽象类和接口】
  • Javascript面试题及详细答案150道之(106-120)