首页 > 编程语言 >【转】C#-INotifyPropertyChanged(解决数据绑定的界面刷新问题)

【转】C#-INotifyPropertyChanged(解决数据绑定的界面刷新问题)

时间:2022-11-22 13:44:35浏览次数:72  
标签:Customer 控件 INotifyPropertyChanged C# 绑定 public string

C#-INotifyPropertyChanged(解决数据绑定的界面刷新问题)

 

最近做项目用到DataGridView,用它绑定数据源后,如果数据源中的数据修改无法及时刷新到控件上,必须切换单元格的焦点才能导致刷新显示新数值,通过查官方文档,用INotifyPropertyChanged解决此问题。

案例如下:

首先定义一个类:Customer

    public class Customer
    {
        public string CustomerName { get; set; }
        public string PhoneNumber { get; set; }
    }

创建一个绑定数据集:

private BindingList<Customer> customers = new BindingList<Customer>();

向数据集中添加数据并绑定到控件:

customers.Add(new Customer() { CustomerName = "张三", PhoneNumber = "010-5263" });
customers.Add(new Customer() { CustomerName = "李四", PhoneNumber = "010-8823" });
dataGridView1.DataSource = customers;

修改数据源:

customers[0].CustomerName = "王五";

此时,dataGridView1中没有及时刷新显示新数据。因为数据修改时并没有通知到控件,为此让Customer实现INotifyPropertyChanged接口,该接口只包含一个事件,当属性值改变时,触发该事件,从而导致注册该事件的方法被执行,达到通知控件的目的。这是通过事件实现观察者模式。

Customer实现INotifyPropertyChanged接口:

复制代码
    public class Customer:INotifyPropertyChanged
    {
        private string _customerName;
        private string _phoneNumber;
        
        public string CustomerName
        {
            get { return _customerName; }
            set
            {
                if(_customerName!=value)
                {
                    _customerName = value;
                    PropertyChanged(this, new PropertyChangedEventArgs("CustomerName"));
                }
            }
        }


        public string PhoneNumber
        {
            get { return _phoneNumber; }
            set
            {
                if (_phoneNumber != value)
                {
                    _phoneNumber = value;
                    PropertyChanged(this, new PropertyChangedEventArgs("PhoneNumber"));
                }
            }
        }

        public event PropertyChangedEventHandler PropertyChanged = delegate { };
    }
复制代码

此时,再次执行修改数据源的代码,控件会及时刷新数据显示,因为属性值改变时通知了控件进行相应的处理。

如果在数据源中添加或删除一条数据,控件也会及时刷新显示,怎么回事?原来BindingList<T>实现了IBindingList接口,该接口声明了事件 ListChangedEventHandler,BindingList<T>在添加或删除记录时,触发该事件。显然,控件在绑定数据集(customers)时,订阅了该事件。

转自 https://www.cnblogs.com/guofeiji/p/5277834.html

标签:Customer,控件,INotifyPropertyChanged,C#,绑定,public,string
From: https://www.cnblogs.com/castlewu/p/16914876.html

相关文章

  • oracle查看执行计划
    1.在执行查询的sql前加上 explainplanFOR例如:explainplanFORselectsysdatefromdual;2.查看生成的执行计划selectplan_table_outputfromTABLE(DBMS_XPLAN.DI......
  • Vulnhub之Hackable II靶机详细解题过程
    HackableII作者:Jason_huawen靶机基本信息名称:Hackable:II地址:https://www.vulnhub.com/entry/hackable-ii,711/识别目标主机IP地址┌──(kali㉿kali)-[~/Vulnhub......
  • MBR16200CT-ASEMI半塑封肖特基二极管MBR16200CT
    编辑:llMBR16200CT-ASEMI半塑封肖特基二极管MBR16200CT型号:MBR16200CT品牌:ASEMI封装:TO-220AB特性:肖特基二极管正向电流:16A反向耐压:200V恢复时间:5ns引脚数量:3芯片......
  • 2、Docker最新入门教程-Docker安装
    1.1Dockerforlinuxcentos7安装Docker1.1.1安装前必读在安装Docker之前,先说一下配置,我这里是Centos7Linux内核:官方建议3.10以上,3.8以上貌似也可。注意:本文的......
  • CentOS 7 yum 无法下载解决方案
    通过yum安装程序时无法下载的解决方法,有需要的小伙伴可以参考一下。环境:CentOS7.6.1810现象:通过yum安装程序时,每个镜像都无法下载文件,提示404错误,排除网络故障。具体现......
  • 2022-11-22 Acwing每日一题
    本系列所有题目均为Acwing课的内容,发表博客既是为了学习总结,加深自己的印象,同时也是为了以后回过头来看时,不会感叹虚度光阴罢了,因此如果出现错误,欢迎大家能够指出错误,我......
  • mac上解决Port already in use: 1099;
    解决方法有两种第一种:换其他的端口再次启动,例如:换1098端口,如果你不想换其他端口,则见第二种方法第二种第一步:使用lsof-itcp:1099查看时那个应用占用了此端口第二部:......
  • Leetcode多线程
    1114.按序打印​​原题链接​​classFoo{public:Foo(){m2.lock();m3.lock();}voidfirst(function<void()>printFirst){......
  • opencv实现人脸识别和眼部识别
    代码importcv2ascvimg=cv.imread("./lena.jpg")gray=cv.cvtColor(img,cv.COLOR_BGR2GRAY)face_cascade=cv.CascadeClassifier('/usr/local/share/opencv4/haarcas......
  • Scikit-learn
    项目过程​​导包——加载数据——数据预处理——选择算法训练数据——测试数据——将测试结果导入.csv中​​数据预处理删除无关特征:如用户ID,训练集和测试集都要删除将文本......