Esta documentación está archivada y no tiene mantenimiento.

INotifyPropertyChanged (Interfaz)

Actualización: noviembre 2007

Notifica a los clientes que un valor de propiedad ha cambiado.

Espacio de nombres:  System.ComponentModel
Ensamblado:  System (en System.dll)

public interface INotifyPropertyChanged
public interface INotifyPropertyChanged
public interface INotifyPropertyChanged

La interfaz INotifyPropertyChanged se utiliza para notificar a los clientes, normalmente a los clientes enlazados, que un valor de propiedad ha cambiado.

Por ejemplo, consideremos un objeto Person con una propiedad denominada FirstName. Para proporcionar una notificación de cambio de propiedad genérica, el tipo Person implementa la interfaz INotifyPropertyChanged y provoca un evento PropertyChanged cuando se cambia FirstName. Si el origen de datos implementa INotifyPropertyChanged y se están llevando a cabo operaciones asincrónicas, no se deben realizar cambios en el origen de datos en un subproceso de fondo. En su lugar, se deben leer los datos en un subproceso de fondo y combinarlos en una lista en el subproceso de la interfaz de usuario.

Para que se produzca la notificación de cambios en un enlace entre un origen de datos y un cliente enlazado, el tipo enlazado debe realizar una de estas acciones:

  • Implementar la interfaz INotifyPropertyChanged (recomendado).

  • Proporcionar un evento de cambio para cada propiedad del tipo enlazado.

No debe realizar las dos.

En el ejemplo de código siguiente se muestra la forma de implementar la interfaz INotifyPropertyChanged. Cuando ejecute este ejemplo, observará que el control enlazado DataGridView refleja el cambio en el origen de datos sin requerir que se restablezca el enlace.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.Common;
using System.Diagnostics;
using System.Drawing;
using System.Data.SqlClient;
using 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 : System.Windows.Forms.Form
{
	// This button causes the value of a list element to be changed.
	private Button changeItemBtn = new Button();

	// This is the DataGridView control that displays the contents 
	// of the list.
	private DataGridView customersDataGridView = new DataGridView();

	// This is the BindingSource used to bind the list to the 
	// DataGridView control.
	private BindingSource customersBindingSource = new BindingSource();

	public Form1()
	{
		// 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(800, 200);
		this.Load += new EventHandler(Form1_Load);
	}

	private void Form1_Load(System.Object sender, System.EventArgs e)
	{
		// Create and populate the list of DemoCustomer objects
		// which will supply data to the DataGridView.
		List<DemoCustomer> customerList = new List<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;
	}

	// This event handler changes the value of the CompanyName
	// property for the first item in the list.
	void changeItemBtn_Click(object sender, EventArgs e)
	{
		// Get a reference to the list from the BindingSource.
		List<DemoCustomer> customerList =
			this.customersBindingSource.DataSource as List<DemoCustomer>;

		// Change the value of the CompanyName property for the 
		// first item in the list.
		customerList[0].CompanyName = "Tailspin Toys";

	}

	

	[STAThread]
	static void Main()
	{
		Application.EnableVisualStyles();
		Application.Run(new Form1());
	}
}

// This class implements a simple customer type 
// 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 customerName = String.Empty;
	private string companyNameValue = String.Empty;
	private string phoneNumberValue = String.Empty;

	public event PropertyChangedEventHandler PropertyChanged;
	
	private void NotifyPropertyChanged(String info)
	{
		if (PropertyChanged != null)
		{
			PropertyChanged(this, new PropertyChangedEventArgs(info));
		}
	}

	// The constructor is private to enforce the factory pattern.
	private DemoCustomer()
	{
		customerName = "no data";
		companyNameValue = "no data";
		phoneNumberValue = "no data";
	}

	// 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 CompanyName
	{
		get
		{
			return this.companyNameValue;
		}

		set
		{
            if (value != this.companyNameValue)
            {
                this.companyNameValue = value;
                NotifyPropertyChanged("CompanyName");
            }
		}
	}

	public string PhoneNumber
	{
		get
		{
			return this.phoneNumberValue;
		}

		set
		{
            if (value != this.phoneNumberValue)
            {
                this.phoneNumberValue = value;
                NotifyPropertyChanged("PhoneNumber");
            }
		}
	}
}


Windows Vista, Windows XP SP2, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP Starter Edition, Windows Server 2003, Windows Server 2000 SP4, Windows Millennium Edition, Windows 98, Windows CE, Windows Mobile para Smartphone, Windows Mobile para Pocket PC, Xbox 360

.NET Framework y .NET Compact Framework no admiten todas las versiones de cada plataforma. Para obtener una lista de las versiones compatibles, vea Requisitos de sistema de .NET Framework.

.NET Framework

Compatible con: 3.5, 3.0, 2.0

.NET Compact Framework

Compatible con: 3.5, 2.0

XNA Framework

Compatible con: 2.0, 1.0
Mostrar: