独胡 發表於 2026-1-9 11:06:16

C#中BindingList的作用小结

<div id="navCategory"><h5 class="catalogue">目录</h5><ul class="first_class_ul"><li>1. 核心作用</li><li>2. 关键特性</li><ul class="second_class_ul"><li>(1) 自动触发UI更新</li><li>(2) 丰富的事件</li><li>(3) 支持编辑通知</li></ul><li>3. 典型使用场景</li><ul class="second_class_ul"><li>(1) WinForms/WPF数据绑定</li></ul><li>4. 注意事项</li><ul class="second_class_ul"></ul></ul></div><p>在C#中,<code>BindingList&lt;T&gt;</code>&nbsp;是一个非常重要的集合类,位于&nbsp;<code>System.ComponentModel</code>&nbsp;命名空间,主要用于实现数据绑定(Data Binding)场景。</p>
<p class="maodian"></p><h2>1. 核心作用</h2>
<p><code>BindingList&lt;T&gt;</code>&nbsp;是&nbsp;<code>List&lt;T&gt;</code>&nbsp;的增强版,主要提供以下功能:</p>
<ul><li><strong>自动通知UI更新</strong>:当集合内容变化(增删改)时,自动触发事件通知绑定控件(如DataGridView、ListBox等)刷新显示。</li><li><strong>支持双向数据绑定</strong>:简化UI控件与数据集合的同步,无需手动编写刷新逻辑。</li><li><strong>扩展的事件支持</strong>:比普通&nbsp;<code>List&lt;T&gt;</code>&nbsp;提供更多细粒度的事件(如&nbsp;<code>AddingNew</code>、<code>ListChanged</code>)。</li></ul>
<p class="maodian"></p><h2>2. 关键特性</h2>
<p class="maodian"></p><h3>(1) 自动触发UI更新</h3>
<div class="jb51code"><pre class="brush:csharp;">BindingList&lt;string&gt; names = new BindingList&lt;string&gt;();
dataGridView1.DataSource = names; // 绑定到DataGridView

names.Add("Alice"); // 添加项时,DataGridView会自动更新显示
names.RemoveAt(0);// 删除项时,UI同步更新</pre></div>
<p class="maodian"></p><h3>(2) 丰富的事件</h3>
<table><thead><tr><th>事件</th><th>触发时机</th></tr></thead><tbody><tr><td>ListChanged</td><td>列表内容或结构变化时(增删改排序等)</td></tr><tr><td>AddingNew</td><td>添加新项之前</td></tr><tr><td>AddingNew</td><td>添加新项之前</td></tr></tbody></table>
<div class="jb51code"><pre class="brush:csharp;">names.ListChanged += (sender, e) =&gt;
{
    Console.WriteLine($"列表已更改,类型: {e.ListChangedType}");
};</pre></div>
<p class="maodian"></p><h3>(3) 支持编辑通知</h3>
<p>若&nbsp;<code>T</code>&nbsp;实现&nbsp;<code>INotifyPropertyChanged</code>,项属性修改时也会通知UI:</p>
<div class="jb51code"><pre class="brush:csharp;">public class Person : INotifyPropertyChanged
{
    private string _name;
    public string Name
    {
      get =&gt; _name;
      set { _name = value; OnPropertyChanged(nameof(Name)); }
    }
    public event PropertyChangedEventHandler? PropertyChanged;
    protected void OnPropertyChanged(string propertyName) =&gt;
      PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}

// 使用
BindingList&lt;Person&gt; people = new BindingList&lt;Person&gt;();
dataGridView1.DataSource = people;

people.Add(new Person { Name = "Bob" });
people.Name = "Alice"; // 修改属性时,UI自动更新!</pre></div>
<p class="maodian"></p><h2>3. 典型使用场景</h2>
<p class="maodian"></p><h3>(1) WinForms/WPF数据绑定</h3>
<div class="jb51code"><pre class="brush:csharp;">// WinForms示例
BindingList&lt;Product&gt; products = new BindingList&lt;Product&gt;();
dataGridView1.DataSource = products;

// WPF示例(需配合ObservableCollection,但BindingList在某些场景仍有用)
listBox.ItemsSource = products;</pre></div>
<p>&nbsp;<strong>(2) 实时监控集合变化</strong></p>
<div class="jb51code"><pre class="brush:csharp;">var logs = new BindingList&lt;string&gt;();
logs.ListChanged += (s, e) =&gt; Console.WriteLine($"日志变更: {logs}");
logs.Add("系统启动"); // 触发事件</pre></div>
<p class="maodian"></p><h2>4. 注意事项</h2>
<ul><li><strong>性能</strong>:频繁大规模更新时,考虑使用&nbsp;<code>ResetItems</code>&nbsp;通知而非逐项更新。</li><li><strong>线程安全</strong>:需通过&nbsp;<code>Invoke</code>&nbsp;在UI线程操作(与所有控件交互一样)。</li><li><strong>WPF优先用&nbsp;</strong><code>ObservableCollection&lt;T&gt;</code>:<code>BindingList</code>&nbsp;主要面向WinForms设计。</li></ul>
<p>到此这篇关于C#中BindingList的作用小结的文章就介绍到这了,更多相关C# BindingList作用内容请搜索琼殿技术社区以前的文章或继续浏览下面的相关文章希望大家以后多多支持琼殿技术社区!&nbsp;</p>
                           
                            <div class="art_xg">
                              <b>您可能感兴趣的文章:</b><ul><li>C#几种截取字符串的方法小结</li><li>C#中HttpWebRequest的用法详解</li><li>C# 一个WCF简单实例</li><li>C#中使用split分割字符串的几种方法小结</li><li>c#的dllimport使用方法详解</li><li>C#中string.format用法详解</li><li>C#中WinForm程序退出方法技巧总结</li><li>C#时间格式化(Datetime)用法详解</li><li>C# Stream 和 byte[] 之间的转换</li></ul>
                            </div>

                        </div>
                        <!--endmain-->
頁: [1]
查看完整版本: C#中BindingList的作用小结