zoukankan      html  css  js  c++  java
  • 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();
                    }
                }
            }
        }
    }
     
  • 相关阅读:
    编译原理-第二章 一个简单的语法指导编译器-2.4 语法制导翻译
    编译原理-第二章 一个简单的语法指导编译器-2.3 语法定义
    编译原理-第二章 一个简单的语法指导编译器-2.2 词法分析
    LeetCode 1347. Minimum Number of Steps to Make Two Strings Anagram
    LeetCode 1348. Tweet Counts Per Frequency
    1349. Maximum Students Taking Exam(DP,状态压缩)
    LeetCode 1345. Jump Game IV(BFS)
    LeetCode 212. Word Search II
    LeetCode 188. Best Time to Buy and Sell Stock IV (动态规划)
    LeetCode 187. Repeated DNA Sequences(位运算,hash)
  • 原文地址:https://www.cnblogs.com/cang/p/4643043.html
Copyright © 2011-2022 走看看