在winform中如何实现双向数据绑定?

简介: 在winform中如何实现双向数据绑定?

什么是双向数据绑定?

双向数据绑定是一种允许我们创建持久连接的技术,使模型数据和用户界面(UI)之间的交互能够自动同步。这意味着当模型数据发生变化时,UI会自动更新,反之亦然。这种双向数据绑定极大地简化了UI和模型数据之间的同步,使开发者可以更专注于业务逻辑,而不是手动处理UI和数据的同步。

今天我想通过winform中DataGridView控件为例,介绍在winform中如何实现双向数据绑定。

一般在winform中使用DataGridView控件时,我们可能是这样使用的:

创建数据源

以Person类为例:

public class Person
  {
      public string? Name { get; set; }
      public string? Home { get; set; }
  }

创建Person对象列表:

// 创建一个Person对象的列表
  List<Person> people = new List<Person>()
  {
      new Person {Name = "张三",Home = "武汉" },
      new Person {Name = "李四",Home = "南昌" },
      new Person {Name = "王五",Home = "福州" },
  };

绑定数据源:

dataGridView1.DataSource = people;

这个时候的效果如下所示:

当我们进行修改之后,如下所示:

现在打印people列表第一个和第二个person对象的Home属性值看看:

Debug.WriteLine(people[0].Home);
  Debug.WriteLine(people[1].Home);

结果如下图所示:

说明在dataGridView1上修改数据,people列表也被修改了。

现在反过来测试一下,修改people列表第一个和第二个person对象的Home属性值:

people[0].Home = "厦门";
 people[1].Home = "厦门";

会发现dataGridView1上的数据不会发生变化,需要我们点击对应的空格之后才会发生改变,如下所示:

如果我们这样写的话:

people[0].Home = "厦门";
 people[1].Home = "厦门";
 dataGridView1.UpdateCellValue(1,1);
 dataGridView1.UpdateCellValue(1,2);

效果如下所示:

只改变了一个空格的值,另一个还是需要点击一下,才更新。

在winform中实现双向数据绑定示例

首先创建一个Student类,如下所示:

public class Student : INotifyPropertyChanged
 {
    
     private string? _name;
     public string Name
     {
         get { return _name; }
         set
         {
             _name = value;
             // Call OnPropertyChanged whenever the property is updated
             OnPropertyChanged("Name");
         }
     }       
     private string? _home;
     public string Home
     {
         get { return _home; }
         set
         {
             _home = value;
             // Call OnPropertyChanged whenever the property is updated
             OnPropertyChanged("Home");
         }
     }
     // Declare the event
     public event PropertyChangedEventHandler? PropertyChanged;
     // Create the OnPropertyChanged method to raise the event
     protected void OnPropertyChanged(string name)
     {
         var handler = PropertyChanged;
         handler?.Invoke(this, new PropertyChangedEventArgs(name));
     }
 }

实现了INotifyPropertyChanged接口。

创建数据源:

// 创建一个Student对象的列表
 BindingList<Student> students = new BindingList<Student>()
 {
         new Student { Name = "张三", Home = "武汉" },
         new Student { Name = "李四", Home = "南昌"  },
         new Student { Name = "王五", Home = "福州"  },
 };

注意这里使用的是BindingList<T>而不是List<T>

BindingList<T>List<T>的区别

BindingList 和 List 都是用于存储对象的集合,但它们之间有一些关键的区别。

  1. 数据绑定支持:BindingList 是为数据绑定设计的,它实现了 IBindingList 接口。这意味着当 BindingList 中的数据发生更改时(例如,添加、删除或修改项),它会自动通知绑定到它的任何 UI 控件。这对于 Windows Forms 或 WPF 这样的 UI 框架非常有用,因为它们可以自动更新以反映数据的更改。相比之下,List 不支持数据绑定。
  2. 事件通知:BindingList 提供了一些额外的事件,如 ListChanged,这可以让你知道列表何时被修改。List 没有这样的事件。
  3. 性能:由于 BindingList 提供了额外的功能,所以在某些情况下,它可能比 List 慢一些。如果你不需要数据绑定或更改通知,那么 List 可能会提供更好的性能。

绑定数据源:

dataGridView1.DataSource = students;

更改数据源的值,查看UI是否会自动改变:

students[0].Home = "厦门";
 students[1].Home = "厦门";

实现的效果如下所示:

发现当数据的值发生改变时,dataGridView1会自动进行更新。

编辑dataGridView1查看数据源是否会发生改变,编辑之后如下图所示:

查看结果:

Debug.WriteLine(students[0].Home);
 Debug.WriteLine(students[1].Home);

结果如下图所示:

说明编辑dataGridView1产生的更改也会导致数据源的更改。

总结

以上就是在winform中实现双向数据绑定的一次实践,要点有两个,第一个是类实现INotifyPropertyChanged,第二个是用BindingList<T>代替List<T>,希望对你有所帮助。

相关文章
|
6月前
|
C# 数据库 Windows
C# WinForms数据绑定详解(手把手教你将数据源绑定到WinForms控件)
本教程带你快速掌握C# WinForms数据绑定,通过定义员工模型并绑定到ListBox和DataGridView,实现数据自动展示。介绍DataSource、DisplayMember及BindingSource的使用,帮助新手减少重复代码,提升开发效率,是WinForms入门必备技能。(238字)
|
存储 缓存 JSON
Unity资源热更新知识梳理及工作流介绍
研究了大半年的热更,才做出了一套相对完善的热更架构。不得不说,这块的知识点还是多而杂的,值得专门开篇博文来记录梳理。
3485 0
|
C# 图形学 Windows
Winform控件优化之背景透明那些事2:窗体背景透明、镂空穿透、SetStyle、GDI透明效果等
两行代码就能实现Form窗体的(背景)透明效果,它不是Opacity属性的整个窗体透明,`TransparencyKey`实现窗体的透明、窗体中间部分镂空效果...
4959 0
Winform控件优化之背景透明那些事2:窗体背景透明、镂空穿透、SetStyle、GDI透明效果等
|
算法 数据可视化
Halcon边缘检测和线条检测(3),文章含BLOB检测常用方法和shape_trans内接和外接算子的说明
Halcon边缘检测和线条检测(3),文章含BLOB检测常用方法和shape_trans内接和外接算子的说明
3269 0
Halcon边缘检测和线条检测(3),文章含BLOB检测常用方法和shape_trans内接和外接算子的说明
|
11月前
|
存储 关系型数据库 MySQL
修复.net Framework4.x连接MYSQL时遇到utf8mb3字符集不支持错误方案。
通过上述步骤大多数情况下能够解决由于UTF-encoding相关错误所带来影响,在实施过程当中要注意备份重要信息以防止意外发生造成无法挽回损失,并且逐一排查确认具体原因以采取针对性措施解除障碍。
695 12
|
JSON API 数据处理
Winform管理系统新飞跃:无缝集成SqlSugar与Web API,实现数据云端同步的革新之路!
【8月更文挑战第3天】在企业应用开发中,常需将Winform桌面应用扩展至支持Web API调用,实现数据云端同步。本文通过实例展示如何在已有SqlSugar为基础的Winform系统中集成HTTP客户端调用Web API。采用.NET的`HttpClient`处理请求,支持异步操作。示例包括创建HTTP辅助类封装请求逻辑及在Winform界面调用API更新UI。此外,还讨论了跨域与安全性的处理策略。这种方法提高了系统的灵活性与扩展性,便于未来的技术演进。
891 2
|
移动开发 编解码 前端开发
摸鱼必备-80款在线HTML小游戏
本文推荐了80款精彩的HTML5在线小游戏,涵盖益智、冒险、射击、体育等多种类型,适合各年龄段玩家。无需下载安装,随时随地畅玩。地址:[https://game.share888.top/](https://game.share888.top/)
5676 7
摸鱼必备-80款在线HTML小游戏
|
开发框架 前端开发 JavaScript
在Winform开发中,使用Async-Awati异步任务处理代替BackgroundWorker
在Winform开发中,使用Async-Awati异步任务处理代替BackgroundWorker
|
编解码 安全 网络安全
RealVNC的 VNC server在windows7系统下无法正确运行
在Windows 7上运行旧版VNC Server(如4.1.2)可能存在兼容性问题,但可通过调整配置解决。步骤包括:安装VNC Server,设置兼容性模式(选择Windows XP SP3),启动VNC Server,配置VNC连接参数。若遇到问题,检查防火墙设置,确保系统更新,并考虑升级到新版VNC Server以提高性能和兼容性。
|
SQL 开发框架 .NET
深入解析Entity Framework Core中的自定义SQL查询与Raw SQL技巧:从基础到高级应用的全面指南,附带示例代码与最佳实践建议
【8月更文挑战第31天】本文详细介绍了如何在 Entity Framework Core (EF Core) 中使用自定义 SQL 查询与 Raw SQL。首先,通过创建基于 EF Core 的项目并配置数据库上下文,定义领域模型。然后,使用 `FromSqlRaw` 和 `FromSqlInterpolated` 方法执行自定义 SQL 查询。此外,还展示了如何使用 Raw SQL 进行数据更新和删除操作。最后,通过结合 LINQ 和 Raw SQL 构建动态 SQL 语句,处理复杂查询场景。本文提供了具体代码示例,帮助读者理解和应用这些技术,提升数据访问层的效率和灵活性。
1025 0