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();

                }

            }

        }

    }

}

 

 

你可能感兴趣的:(property)