miércoles, 30 de junio de 2010

Detectar Cambios en una Clase

Hola, después de un tiempo donde no he podido escribir nada, os traigo este post acerca de la Interfaz "INotifyPropertyChanged".

Ya que ando dando una formación de VB2008, he estado dando un breve ejemplo de LINQTOSQL.

Uno de mis alumnos me pregunto: ¿Cómo puedo determinar si los controles que tengo en un formulario han cambiado?


Y me explico su idea de como hacerlo a través del evento TextChanged de los controles y con una variable de tipo Boolean.

Puesto que no soy ningun, experto en LINQTOSQL, estuve investigando un poco y vi que se podia determinar si existen cambios en el objeto de contexto
(igual que esto tambien puede hacerse en un datatable/dataset).

Descubri que las clases generadas, por VS, para cada una de las entidades de la base de datos implementan las Interfaces INotifyPropertyChanged y
INotifyPropertyChanging.

Ambas interfaces se encuentran definidas en el espacio de Nombres "System.ComponentModel".

La Interfaz "INotifyPropertyChanged" se va a utilizar para indicar que hay cambios pendientes en una clase o entidad. Como bien dice la MSDN,
es muy util cuando estamos trabajando con objetos enlazados, por ejemplo:

Tenemos un DataGridView enlazado a nuestra tabla de empleados, y estamos en un formulario visualizando los datos de uno de esos empleados, cualquier
cambio que hagamos en el formulario, se va a reflejar de manera inmediata en nuestro DataGridView. (Ojo trabajando con un BindingSource como origen
de datos de las cajas de texto de nuestro formulario).

La Interfaz "INotifyPropertyChanging" nos va a indicar que una propiedad está cambiando.

Para que podamos trabajar con estas interfaces, vamos a hacer una pequeña clase de ejemplo:




Imports System.ComponentModel

Public Class NotificacionCambios

Implements INotifyPropertyChanged, INotifyPropertyChanging

Public Event PropertyChanged(ByVal sender As Object, ByVal e As System.ComponentModel.PropertyChangedEventArgs) Implements System.ComponentModel.INotifyPropertyChanged.PropertyChanged
Public Event PropertyChanging(ByVal sender As Object, ByVal e As System.ComponentModel.PropertyChangingEventArgs) Implements System.ComponentModel.INotifyPropertyChanging.PropertyChanging

Private _nombre As String
Public Property Nombre() As String
Get
Return _nombre
End Get
Set(ByVal value As String)
If _nombre = value Then Exit Property
RaiseEvent PropertyChanging(Me, New PropertyChangingEventArgs(String.Empty))
_nombre = value
RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs("Nombre"))
End Set
End Property
End Class

Espero que os sea de utilidad, y si teneis alguna duda, ya sabeis donde estoy.

Fuente:
http://msdn.microsoft.com/en-us/library/system.componentmodel.inotifypropertychanging.aspx
http://msdn.microsoft.com/en-us/library/system.componentmodel.inotifypropertychanged.aspx

No hay comentarios:

Publicar un comentario en la entrada