在C#中,BindingList<T>
?是一個非常重要的集合類,位于?System.ComponentModel
?命名空間,主要用于實現數據綁定(Data Binding)場景。
1. 核心作用
BindingList<T>
?是?List<T>
?的增強版,主要提供以下功能:
自動通知UI更新:當集合內容變化(增刪改)時,自動觸發事件通知綁定控件(如DataGridView、ListBox等)刷新顯示。
支持雙向數據綁定:簡化UI控件與數據集合的同步,無需手動編寫刷新邏輯。
擴展的事件支持:比普通?
List<T>
?提供更多細粒度的事件(如?AddingNew
、ListChanged
)。
?
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. 注意事項
性能:頻繁大規模更新時,考慮使用?
ResetItems
?通知而非逐項更新。線程安全:需通過?
Invoke
?在UI線程操作(與所有控件交互一樣)。WPF優先用?
ObservableCollection<T>
:BindingList
?主要面向WinForms設計。