次の方法で共有


INotifyPropertyChanged インターフェイス

定義

プロパティ値が変更されたことをクライアントに通知します。

public interface class INotifyPropertyChanged
public interface INotifyPropertyChanged
type INotifyPropertyChanged = interface
Public Interface INotifyPropertyChanged
派生

次のコード例は、 インターフェイスを実装する方法を INotifyPropertyChanged 示しています。 この例を実行すると、バインド DataGridView コントロールにデータ ソースの変更が反映され、バインドをリセットする必要はありません。

CallerMemberName 属性を使用する場合、NotifyPropertyChanged メソッドの呼び出しが、文字列引数としてプロパティ名を指定する必要はありません。 詳細については、「 呼び出し元情報」を参照してください。

Form1 のコードを次のコードに置き換え、名前空間をプロジェクトの名前に変更します。 別の方法として、プロジェクトを作成するときに、以下の名前空間名を使用してプロジェクトに名前を付けることができます。

using System;  
using System.Collections.Generic;  
using System.ComponentModel;  
using System.Drawing;  
using System.Runtime.CompilerServices;  
using System.Windows.Forms;  

// Either change the following namespace to the name of your project,   
// or name your project with the following name when you create it.  
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 = "")  
        {  
            PropertyChanged?.Invoke(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();  
                }  
            }  
        }  
    }  
}  
Imports System  
Imports System.Collections.Generic  
Imports System.ComponentModel  
Imports System.Drawing  
Imports System.Runtime.CompilerServices  
Imports System.Windows.Forms  

' 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 Class Form1  
    Inherits System.Windows.Forms.Form  
    ' This button causes the value of a list element to be changed.  
    Private changeItemBtn As New Button()  

    ' This DataGridView control displays the contents of the list.  
    Private customersDataGridView As New DataGridView()  

    ' This BindingSource binds the list to the DataGridView control.  
    Private customersBindingSource As New BindingSource()  

    Public Sub New()  
        InitializeComponent()  

        ' Set up the "Change Item" button.  
        Me.changeItemBtn.Text = "Change Item"  
        Me.changeItemBtn.Dock = DockStyle.Bottom  
        AddHandler Me.changeItemBtn.Click, AddressOf changeItemBtn_Click  
        Me.Controls.Add(Me.changeItemBtn)  

        ' Set up the DataGridView.  
        customersDataGridView.Dock = DockStyle.Top  
        Me.Controls.Add(customersDataGridView)  

        Me.Size = New Size(400, 200)  
    End Sub  

    Private Sub Form1_Load(ByVal sender As System.Object, _  
        ByVal e As System.EventArgs) Handles Me.Load  

        ' Create and populate the list of DemoCustomer objects  
        ' which will supply data to the DataGridView.  
        Dim customerList As New BindingList(Of DemoCustomer)  

        customerList.Add(DemoCustomer.CreateNewCustomer())  
        customerList.Add(DemoCustomer.CreateNewCustomer())  
        customerList.Add(DemoCustomer.CreateNewCustomer())  

        ' Bind the list to the BindingSource.  
        Me.customersBindingSource.DataSource = customerList  

        ' Attach the BindingSource to the DataGridView.  
        Me.customersDataGridView.DataSource = Me.customersBindingSource  
    End Sub  

    ' This event handler changes the value of the CompanyName  
    ' property for the first item in the list.  
    Private Sub changeItemBtn_Click(ByVal sender As Object, ByVal e As EventArgs)  
        ' Get a reference to the list from the BindingSource.  
        Dim customerList As BindingList(Of DemoCustomer) = _  
            CType(customersBindingSource.DataSource, BindingList(Of 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"  
    End Sub  
End Class  

' This class implements a simple customer type   
' that implements the IPropertyChange interface.  

Public Class DemoCustomer  
    Implements INotifyPropertyChanged  

    ' These fields hold the values for the public properties.  
    Private idValue As Guid = Guid.NewGuid()  
    Private customerNameValue As String = String.Empty  
    Private phoneNumberValue As String = String.Empty  

    Public Event PropertyChanged As PropertyChangedEventHandler _  
        Implements INotifyPropertyChanged.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 Sub NotifyPropertyChanged(<CallerMemberName()> Optional ByVal propertyName As String = Nothing)  
        RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(propertyName))  
    End Sub  

    ' The constructor is private to enforce the factory pattern.  
    Private Sub New()  
        customerNameValue = "Customer"  
        phoneNumberValue = "(312)555-0100"  
    End Sub  

    ' This is the public factory method.  
    Public Shared Function CreateNewCustomer() As DemoCustomer  
        Return New DemoCustomer()  
    End Function  

    ' This property represents an ID, suitable  
    ' for use as a primary key in a database.  
    Public ReadOnly Property ID() As Guid  
        Get  
            Return Me.idValue  
        End Get  
    End Property  

    Public Property CustomerName() As String  
        Get  
            Return Me.customerNameValue  
        End Get  

        Set(ByVal value As String)  
            If Not (value = customerNameValue) Then  
                Me.customerNameValue = value  
                NotifyPropertyChanged()  
            End If  
        End Set  
    End Property  

    Public Property PhoneNumber() As String  
        Get  
            Return Me.phoneNumberValue  
        End Get  

        Set(ByVal value As String)  
            If Not (value = phoneNumberValue) Then  
                Me.phoneNumberValue = value  
                NotifyPropertyChanged()  
            End If  
        End Set  
    End Property  
End Class  

注釈

インターフェイスは INotifyPropertyChanged 、プロパティ値が変更されたことをクライアントに通知するために使用されます (通常はクライアントをバインドします)。

たとえば、 というFirstNameプロパティをPerson持つ オブジェクトを考えてみましょう。 ジェネリック プロパティ変更通知を提供するために、 型は Person インターフェイスをINotifyPropertyChanged実装し、 が変更されたときにFirstNameイベントをPropertyChanged発生させます。

バインドされたクライアントとデータ ソースの間のバインドで変更通知を行う場合、バインドされた型は次のいずれかである必要があります。

  • インターフェイスを実装します INotifyPropertyChanged (推奨)。

  • バインドされた型の各プロパティに変更イベントを指定します。

両方を行うことは避けてください。

イベント

PropertyChanged

プロパティ値が変更するときに発生します。

適用対象