WinForm中实现双向数据绑定的示例详解
作者:小码编匠
前言
在开发 WinForm 应用程序时,常常需要将数据模型与用户界面进行同步。传统的做法是手动监听 UI 变化并更新数据模型,或者反过来更新 UI 控件,这种方式不仅繁琐,而且容易出错。
为了解决这个问题,许多现代 UI 框架都支持双向数据绑定(Two-Way Data Binding),即当模型数据发生变化时,UI 自动更新;而当用户通过 UI 修改数据时,模型也会自动同步变化。这种机制极大提升了开发效率和代码可维护性。
本文将以 WinForms 中的 DataGridView 控件为例,演示不使用双向绑定时的数据同步问题,并详细介绍如何通过实现 INotifyPropertyChanged 接口和使用 BindingList<T> 来实现真正的双向数据绑定。
什么是双向数据绑定?
双向数据绑定是一种允许我们创建持久连接的技术,使模型数据和用户界面(UI)之间的交互能够自动同步。这意味着:
当模型数据发生变化时,UI 会自动更新;
当用户在 UI 上修改数据后,模型数据也会自动更新。
这种双向数据绑定极大地简化了 UI 和模型数据之间的同步,开发可以更专注于业务逻辑,而不是手动处理 UI 和数据的同步。
不使用双向绑定的示例
通常在 WinForms 中使用 DataGridView 控件展示数据时,我们会创建一个类作为数据模型,并将其对象列表绑定到 DataGridView 的 DataSource 属性中。
例如,我们定义一个 Person 类:
public class Person
{
public string? Name { get; set; }
public string? Home { get; set; }
}
然后创建一个 List<Person> 数据源并绑定:
// 创建一个Person对象的列表
List<Person> people = new List<Person>()
{
new Person {Name = "张三", Home = "武汉" },
new Person {Name = "李四", Home = "南昌" },
new Person {Name = "王五", Home = "福州" },
};
dataGridView1.DataSource = people;
绑定后的效果如下图所示:

当我们对 dataGridView1 中的数据进行修改后,查看 people 列表中的数据是否也被更新:
Debug.WriteLine(people[0].Home); Debug.WriteLine(people[1].Home);
结果如下图所示:

说明在 dataGridView1 上修改数据后,people 列表也确实发生了变化。
但如果我们反向操作,在代码中直接修改 people 列表的数据:
people[0].Home = "厦门"; people[1].Home = "厦门";
此时发现 dataGridView1 上的数据并不会立即刷新,必须点击某个单元格才能触发更新。

如果我们调用以下方法强制刷新:
dataGridView1.UpdateCellValue(1, 1); dataGridView1.UpdateCellValue(1, 2);
则可以看到部分数据更新成功,但仍需手动干预:

这表明:默认情况下,List<T> 并不能自动通知 UI 进行更新,因此无法实现真正的“双向绑定”。
在 WinForms 中实现双向数据绑定示例
为了实现双向绑定,我们需要做两件事:
1、模型类实现 INotifyPropertyChanged 接口;
2、使用 BindingList<T> 替代 List<T> 作为数据源。
定义 Student 类并实现 INotifyPropertyChanged
public class Student : INotifyPropertyChanged
{
private string? _name;
public string Name
{
get => _name;
set
{
_name = value;
OnPropertyChanged(nameof(Name));
}
}
private string? _home;
public string Home
{
get => _home;
set
{
_home = value;
OnPropertyChanged(nameof(Home));
}
}
public event PropertyChangedEventHandler? PropertyChanged;
protected void OnPropertyChanged(string propertyName)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
创建 BindingList< Student> 数据源
BindingList<Student> students = new BindingList<Student>()
{
new Student { Name = "张三", Home = "武汉" },
new Student { Name = "李四", Home = "南昌" },
new Student { Name = "王五", Home = "福州" }
};
dataGridView1.DataSource = students;
注意这里使用的不再是 List<T >,而是 BindingList<T >。这是关键所在,因为 BindingList<T > 支持数据变更的通知。
测试双向绑定效果
我们在代码中修改数据源:
students[0].Home = "厦门"; students[1].Home = "厦门";
此时 dataGridView1 会自动更新,无需任何额外操作:

同样地,如果我们在 dataGridView1 中编辑数据,students 数据源也会随之改变:
Debug.WriteLine(students[0].Home); Debug.WriteLine(students[1].Home);
输出结果如下:

这表明双向绑定已经生效。
BindingList< T> 与 List< T> 的区别
| 特性 | BindingList< T> | List< T> |
|---|---|---|
| 数据绑定支持 | ✅ 支持,自动通知控件更新 | ❌ 不支持 |
| 更改通知事件 | ✅ 提供 ListChanged 事件 | ❌ 不提供 |
| 性能 | 相对稍慢 | 更快 |
| 适用场景 | 需要数据绑定的 UI 应用 | 仅用于存储数据 |
总结
本文通过一个完整的案例,详细讲解了在 WinForms 中如何实现真正的双向数据绑定。核心要点如下:
双向数据绑定的本质 是让模型数据和 UI 界面保持自动同步;
默认情况下,List< T> + DataGridView 只能实现单向绑定(UI -> 数据),不能自动响应数据变化;
实现双向绑定的关键:
模型类必须实现
INotifyPropertyChanged接口;数据源应使用
BindingList<T>而不是List<T>。
通过上述方式,我们可以轻松实现 WinForm 中的数据绑定功能,提高开发效率,减少手动同步带来的错误和复杂度。
希望这篇文章对大家理解 WinForm 中的双向数据绑定有所帮助!大家如果正在开发 WinForm 应用,不妨尝试使用这些技术来提升的项目质量。
最后
以上就是WinForm中实现双向数据绑定的示例详解的详细内容,更多关于WinForm双向数据绑定的资料请关注脚本之家其它相关文章!
