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


    引用:https://www.cnblogs.com/guofeiji/p/5277834.html

    最近做项目用到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)时,订阅了该事件。

    HK
  • 相关阅读:
    jQuery 事件注册
    jQuery 获取元素当前位置offset()与position()
    jquery scrollTop()与scrollLeft()
    linux常用命令
    php5.6+apache2.4环境配置
    php 开启socket配置
    Node.js的学习路线
    apache配置rewrite及.htaccess文件(转载)
    php 获取域名等Url
    html5的本地存储
  • 原文地址:https://www.cnblogs.com/HarryK4952/p/14452440.html
Copyright © 2020-2023  润新知