开发者

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

目录
  • 前言
  • 什么是双向数据绑定?
  • 不使用双向绑定的示例
  • 在 WinForms 中实现双向数据绑定示例
    • 定义 Student 类并实现 INotifyPropertyChanged
    • 创建 BindingList< Student> 数据源
    • 测试双向绑定效果
  • BindingList< T> 与 List< T> 的区别
    • 总结
      • 最后

        前言

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

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

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

        什么是双向数据绑定?

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

        • 当模型数据发生变化时,UI 会自动更新;

        • 当用户在 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 = "南昌" },
         http://www.devze.com   new Person {Name = "王五", Home = "福州" },
        };
        
        dataGridView1.DataSource = people;
        

        绑定后的效果如下图所示:

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

        当我们对 dataGridView1 中的数据进行修改后,查看 people 列表中的数据是否也被更新:

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

        结果如下图所示:

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

        说明在 dataGridView1 上修改数据后,people 列表也确实发生了变化。

        但如果我们反向操作,在代码中直接修改 people 列表的数据:

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

        此时发现 dataGridView1 上的数据并不会立即刷新,必须点击某个单元格才能触发更新。

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

        如果我们调用以下方法强制刷新:

        dataGridView1.UpdateCellValue(1, 1);
        dataGridView1.UpdateCellValue(1, 2);
        

        则可以看到部分数据更新成功,但仍需手动干预:

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

        这表明:默认情况下,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));
                }
            }
        
          www.devze.com  public event PropertyChangedEventHandler? PropertyChanged;
        
            protected void OnPropertyChangetNLraNeWd(string propertyName)http://www.devze.com
            {
                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 会自动更新,无需任何额外操作:

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

        同样地,如果我们在 dataGridView1 中编辑数据,students 数据源也会随之改变:

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

        输出结果如下:

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

        这表明双向绑定已经生效。

        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双向数据绑定的资料请关注编程客栈(www.devze.com)其它相关文章!

        0

        上一篇:

        下一篇:

        精彩评论

        暂无评论...
        验证码 换一张
        取 消

        最新开发

        开发排行榜