La interfaz INotifyPropertyChanged proporciona un mecanismo unificado para definir en un único evento las propiedades Changed que queramos definir en nuestros objetos.
Cuando se crea un objeto, o un control, o un componente, es habitual la implementación de un sistema que notifique al cliente (que usa el control) que se ha producido un cambio en alguna de sus propiedades. Normalmente se realiza escribiendo eventos del tipo PropiedadChanged. Esto da lugar a que un componente pueda contar con una lista bastante extensa de eventos, potencialmente tantos como propiedades puedan ser modificadas, que tienen siempre la misma finalidad: notificar que el contenido de una cierta propiedad ha cambiado.
La interfaz [System.ComponentModel.INotifyPropertyChanged], introducida en la versión 2.0 de la plataforma, proporciona un mecanismo para reunir en un unico evento todos los eventos 'changed' de nuestro objeto
Public Class Colega Implements System.ComponentModel.INotifyPropertyChanged Private mNombre As String Private mApellidos As String Private mTelefono As String Public Event PropertyChanged( _ ByVal sender As Object, _ ByVal e As System.ComponentModel.PropertyChangedEventArgs) _ Implements System.ComponentModel.INotifyPropertyChanged.PropertyChanged Public Property Nombre() As String Get Return mNombre End Get Set(ByVal value As String) If mNombre <> value Then mNombre = value RaiseEvent PropertyChanged( _ Me, New System.ComponentModel.PropertyChangedEventArgs("Nombre")) End If End Set End Property Public Property Apellidos() As String Get Return mApellidos End Get Set(ByVal value As String) If mApellidos <> value Then mApellidos = value Dim nombrePropiedad As String nombrePropiedad = System.Reflection.MethodBase.GetCurrentMethod.Name RaiseEvent PropertyChanged( _ Me, New System.ComponentModel.PropertyChangedEventArgs(nombrePropiedad)) End If End Set End Property End Class
Public Class Colega Implements System.ComponentModel.INotifyPropertyChanged
La interfaz INotifyPropertyChanged, cuenta como único miembro con el evento PropertyChanged, definido de la siguiente manera:
Public Event PropertyChanged( _ ByVal sender As Object, _ ByVal e As System.ComponentModel.PropertyChangedEventArgs) _ Implements System.ComponentModel.INotifyPropertyChanged.PropertyChanged
Aquí lo tienes más sencillo quitando todos los calificadores
Public Event PropertyChanged( _ ByVal sender As Object, _ ByVal e As.PropertyChangedEventArgs) _ Implements INotifyPropertyChanged.PropertyChanged
Los parámetros de la definición deben contener la siguiente información:
Cuando haga falta comunicar la modificación de una propiedad, se utilizará la instrucción RaiseEvent para generar este evento
Public Property Nombre() As String Get Return mNombre End Get Set(ByVal value As String) If mNombre <> value Then mNombre = value RaiseEvent PropertyChanged( _ Me, New PropertyChangedEventArgs("Nombre")) End If End Set End Property
Tambien podemos utilizar la reflexión para obtener el nombre del método o la propiedad, pero en este caso hay que tener en cuenta que una propiedad (por ejemplo Apellidos) tiene dos nombres, el correspondiente al apartado Set (que será set_Apellidos) y el correspondiente al apartado Get (que será get_Apellidos). Si desconoces este pequeño detalle, puedes tener errores tontos al identificar los nombres de la propiedad que ha "changed"
Public Property Apellidos() As String Get Return mApellidos End Get Set(ByVal value As String) If mApellidos <> value Then mApellidos = value Dim nombrePropiedad As String nombrePropiedad = System.Reflection.MethodBase.GetCurrentMethod.Name ' ¡¡¡ ATENCION !!! ' La variable {nombrePropiedad} toma el valor {"set_Apellidos"} RaiseEvent PropertyChanged( _ Me, New PropertyChangedEventArgs(nombrePropiedad)) End If End Set End Property
Una alternativa a la forma de lanzar el evento, es diseñar una función que se encargue de lanzarlo. Puedes ver el código original en el que se basa el ejemplo siguiente en ésta página de MSDM
Public Property Apellidos As String Get Return mApellidos End Get Set(ByVal value As String) If mApellidos <> value Then mApellidos = value ' ¡¡¡ ATENCION !!! ' La variable {nombrePropiedad} toma el valor {"set_Apellidos"} Dim nombrePropiedad As String nombrePropiedad = System.Reflection.MethodBase.GetCurrentMethod.Name ' Utilizando la funcion para diparar el evento Call DispararNotifyPropertyChanged(nombrePropiedad) End If End Set End Property ''' <summary> ''' Funcion que dispara el evento [PropertyChanged] ''' </summary> ''' <param name="nombreDeLaPropiedadChanged"> ''' Una cadena con el nombre de la propiedad que ha cambiado ''' </param> ''' <remarks> ''' <code>http://msdn.microsoft.com/es-es/library/system.componentmodel.inotifypropertychanged(VS.95).aspx</code> '''</remarks> Public Sub DispararNotifyPropertyChanged(ByVal nombreDeLaPropiedadChanged As String) ' evitar problemas tontos If String.IsNullOrEmpty(nombreDeLaPropiedadChanged) = True Then Exit Sub ' disparar el evento RaiseEvent PropertyChanged( _ Me, New System.ComponentModel.PropertyChangedEventArgs(nombreDeLaPropiedadChanged)) End Sub
Solo por si acaso, la clase cliente tiene que instanciar un objeto (a nivel de clase) con la palabra clave [WithEvents] para poder interceptar los eventos de la clase
Dim WithEvents objColega As New Colega
Y a continuación, en la clase cliente, solo tenemos que interceptar el evento y tratarlo de la forma mas adecuada
Private Sub objColega_PropertyChanged( _ ByVal sender As Object, _ ByVal e As System.ComponentModel.PropertyChangedEventArgs) _ Handles objColega.PropertyChanged Me.TextBox1.Text = "Propiedad que cambia " & e.PropertyName End Sub
Este sistema de notificación deberá implementarse en las clases (componentes, etc.) que acceden a datos y que pueden ser vinculados a un control (Data Binding) para mostrar su contenido.
Un Buen libro
© 1997 - - La Güeb de Joaquín | |||||
Joaquín Medina Serrano
|
|||||
|
Codificación | |
Fecha de creación | |
Última actualización |