• INotifyPropertyChanged接口的PropertyChanged 事件


    INotifyPropertyChanged 接口用于向客户端(通常是执行绑定的客户端)发出某一属性值已更改的通知。

    例如,考虑一个带有名为 FirstName 属性的 Person 对象。 若要提供一般性属性更改通知,则 Person 类型实现 INotifyPropertyChanged 接口并在 FirstName更改时引发 PropertyChanged 事件。

    若要在将客户端与数据源进行绑定时发出更改通知,则绑定类型应具有下列任一功能:

    • 实现 INotifyPropertyChanged 接口(首选)。

    • 为绑定类型的每个属性提供更改事件。

    上述这两个功能不要同时实现。

    示例
     

    下面的代码示例演示如何实现 INotifyPropertyChanged 接口。 在运行此示例时,您将注意到绑定的 DataGridView 控件无需重置绑定即能反映数据源中的更改。

    如果使用 CallerMemberName 属性,对 NotifyPropertyChanged 方法不必指定属性名称作为字符串参数。 有关更多信息,请参见 调用方信息(C# 和 Visual Basic)

     
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Drawing;
    using System.Runtime.CompilerServices;
    using System.Windows.Forms;
    
    // Change the namespace to the project name.
    namespace TestNotifyPropertyChangedCS
    {
        // This form demonstrates using a BindingSource to bind
        // a list to a DataGridView control. The list does not
        // raise change notifications. However the DemoCustomer type 
        // in the list does.
        public partial class Form1 : Form
        {
            // This button causes the value of a list element to be changed.
            private Button changeItemBtn = new Button();
    
            // This DataGridView control displays the contents of the list.
            private DataGridView customersDataGridView = new DataGridView();
    
            // This BindingSource binds the list to the DataGridView control.
            private BindingSource customersBindingSource = new BindingSource();
    
            public Form1()
            {
                InitializeComponent();
    
                // Set up the "Change Item" button.
                this.changeItemBtn.Text = "Change Item";
                this.changeItemBtn.Dock = DockStyle.Bottom;
                this.changeItemBtn.Click +=
                    new EventHandler(changeItemBtn_Click);
                this.Controls.Add(this.changeItemBtn);
    
                // Set up the DataGridView.
                customersDataGridView.Dock = DockStyle.Top;
                this.Controls.Add(customersDataGridView);
    
                this.Size = new Size(400, 200);
            }
    
            private void Form1_Load(object sender, EventArgs e)
            {
                // Create and populate the list of DemoCustomer objects
                // which will supply data to the DataGridView.
                BindingList<DemoCustomer> customerList = new BindingList<DemoCustomer>();
                customerList.Add(DemoCustomer.CreateNewCustomer());
                customerList.Add(DemoCustomer.CreateNewCustomer());
                customerList.Add(DemoCustomer.CreateNewCustomer());
    
                // Bind the list to the BindingSource.
                this.customersBindingSource.DataSource = customerList;
    
                // Attach the BindingSource to the DataGridView.
                this.customersDataGridView.DataSource =
                    this.customersBindingSource;
    
            }
    
            // Change the value of the CompanyName property for the first 
            // item in the list when the "Change Item" button is clicked.
            void changeItemBtn_Click(object sender, EventArgs e)
            {
                // Get a reference to the list from the BindingSource.
                BindingList<DemoCustomer> customerList =
                    this.customersBindingSource.DataSource as BindingList<DemoCustomer>;
    
                // Change the value of the CompanyName property for the 
                // first item in the list.
                customerList[0].CustomerName = "Tailspin Toys";
                customerList[0].PhoneNumber = "(708)555-0150";
            }
    
        }
    
        // This is a simple customer class that 
        // implements the IPropertyChange interface.
        public class DemoCustomer : INotifyPropertyChanged
        {
            // These fields hold the values for the public properties.
            private Guid idValue = Guid.NewGuid();
            private string customerNameValue = String.Empty;
            private string phoneNumberValue = String.Empty;
    
            public event PropertyChangedEventHandler PropertyChanged;
    
            // This method is called by the Set accessor of each property.
            // The CallerMemberName attribute that is applied to the optional propertyName
            // parameter causes the property name of the caller to be substituted as an argument.
            private void NotifyPropertyChanged([CallerMemberName] String propertyName = "")
            {
                if (PropertyChanged != null)
                {
                    PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
                }
            }
    
            // The constructor is private to enforce the factory pattern.
            private DemoCustomer()
            {
                customerNameValue = "Customer";
                phoneNumberValue = "(312)555-0100";
            }
    
            // This is the public factory method.
            public static DemoCustomer CreateNewCustomer()
            {
                return new DemoCustomer();
            }
    
            // This property represents an ID, suitable
            // for use as a primary key in a database.
            public Guid ID
            {
                get
                {
                    return this.idValue;
                }
            }
    
            public string CustomerName
            {
                get
                {
                    return this.customerNameValue;
                }
    
                set
                {
                    if (value != this.customerNameValue)
                    {
                        this.customerNameValue = value;
                        NotifyPropertyChanged();
                    }
                }
            }
    
            public string PhoneNumber
            {
                get
                {
                    return this.phoneNumberValue;
                }
    
                set
                {
                    if (value != this.phoneNumberValue)
                    {
                        this.phoneNumberValue = value;
                        NotifyPropertyChanged();
                    }
                }
            }
        }
    }
     
  • 相关阅读:
    Linux防火墙命令
    Linux学习笔记:(三)软件包管理(更新中)
    Linux赋予root权限
    Linux学习笔记:(二)用户和组群账户管理
    Linux目录结构
    Sublime Text3中Package Control Install Package打不开问题
    Linux学习笔记:(一)常用命令大全
    SpringBoot项目中整合Mybatis框架
    IDEA快速创建springboot项目
    java.lang.NoClassDefFoundError: javax/servlet/ServletOutputStream 报错解决
  • 原文地址:https://www.cnblogs.com/cang/p/4643043.html
Copyright © 2020-2023  润新知