C#教程

关注公众号 jb51net

关闭
首页 > 软件编程 > C#教程 > WinForm双向数据绑定

WinForm中实现双向数据绑定的示例详解

作者:小码编匠

在开发WinForm应用程序时,常常需要将数据模型与用户界面进行同步,传统的做法是手动监听UI变化并更新数据模型,这种方式不仅繁琐而且容易出错,为了解决这个问题,许多现代UI框架都支持双向数据绑定,本文介绍WinForm中实现双向数据绑定的示例,需要的朋友可以参考下

前言

在开发 WinForm 应用程序时,常常需要将数据模型与用户界面进行同步。传统的做法是手动监听 UI 变化并更新数据模型,或者反过来更新 UI 控件,这种方式不仅繁琐,而且容易出错。

为了解决这个问题,许多现代 UI 框架都支持双向数据绑定(Two-Way Data Binding),即当模型数据发生变化时,UI 自动更新;而当用户通过 UI 修改数据时,模型也会自动同步变化。这种机制极大提升了开发效率和代码可维护性。

本文将以 WinForms 中的 DataGridView 控件为例,演示不使用双向绑定时的数据同步问题,并详细介绍如何通过实现 INotifyPropertyChanged 接口和使用 BindingList<T> 来实现真正的双向数据绑定。

什么是双向数据绑定?

双向数据绑定是一种允许我们创建持久连接的技术,使模型数据和用户界面(UI)之间的交互能够自动同步。这意味着:

这种双向数据绑定极大地简化了 UI 和模型数据之间的同步,开发可以更专注于业务逻辑,而不是手动处理 UI 和数据的同步。

不使用双向绑定的示例

通常在 WinForms 中使用 DataGridView 控件展示数据时,我们会创建一个类作为数据模型,并将其对象列表绑定到 DataGridViewDataSource 属性中。

例如,我们定义一个 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 -> 数据),不能自动响应数据变化;

实现双向绑定的关键

通过上述方式,我们可以轻松实现 WinForm 中的数据绑定功能,提高开发效率,减少手动同步带来的错误和复杂度。

希望这篇文章对大家理解 WinForm 中的双向数据绑定有所帮助!大家如果正在开发 WinForm 应用,不妨尝试使用这些技术来提升的项目质量。

最后

以上就是WinForm中实现双向数据绑定的示例详解的详细内容,更多关于WinForm双向数据绑定的资料请关注脚本之家其它相关文章!

您可能感兴趣的文章:
阅读全文