Este código muestra un ejemplo práctico de cómo declarar propiedades de dependencia en un control. La primera de ellas es una propiedad estándar que contiene un valor numérico, la segunda de ellas en un valor numérico que tiene que estar reflejado en un control [TextBox], de forma que si cambia la propiedad cambia el valor del [TextBox], y si cambia el [TextBox], cambia el valor de la propiedad de dependencia.
Importante, estoy trabajando en un control de usuario
La situación de ejemplo, es la escritura de un control de usuario. En ese control hay que disparar eventos (eventos enrutados) y hay que declarar propiedades de dependencia, y alguna de ellas, tiene que estar a la par con algún valor de algún control, por ejemplo de un TextBox. De forma que si cambia la propiedad cambia el valor del [TextBox], y si cambia el [TextBox], cambia el valor de la propiedad de dependencia.
Se supone que guardo un valor numérico, por ejemplo el valor máximo de una cantidad
''' <summary> ''' Valor Máximo para el control numérico Up Down ''' </summary> Public Property ZMaximum() As Integer Get Return CInt(GetValue(ZMaximumProperty)) End Get Set(value As Integer) SetValue(ZMaximumProperty, value) End Set End Property ' Propiedad de dependencia para almacenar el valor Maximum. ' permite usar animaciones, estilos, binding, etc Public Shared ReadOnly ZMaximumProperty As DependencyProperty = DependencyProperty.Register("ZMaximum", GetType(Integer), GetType(UC_UpDown), New UIPropertyMetadata(Integer.MaxValue))
Una propiedad [Valor], que representa el valor numérico de un control [TextBox]
''' <summary> ''' Devuelve el numero del control ''' </summary> Public Property Text() As String Get If textBoxNumero Is Nothing Then Return String.Empty Return Me.ZValue.ToString End Get Set(value As String) ' comprobar si se puede convertir para evitar errores If CanConverTextBoxNumeroToInteger(value) = False Then Exit Property ' usar la propiedad de dependencia para almacenar este valor Me.ZValue = Convert.ToInt32(value) End Set End Property
''' <summary> ''' La propiedad [Value], representa el valor del control ''' TextBox [textBoxNumero] en el control. ''' </summary> ''' <Value>El valor actual contenido en el [textBoxNumero] del control</Value> Public Property ZValue() As Integer Get Return CInt(GetValue(ZValueProperty)) End Get Set(value As Integer) ' actualizar el valor. ' (El text-box se actualiza a trabes de [PropertyChangedCallback]) SetValue(ZValueProperty, value) ' disparar el evento (enrutado) [ZValueChanged] Call OnValueChanged() End Set End Property ''' <summary> ''' Usar una DependencyProperty como valor de respaldo para Value. ''' </summary> Public Shared ReadOnly ZValueProperty As DependencyProperty = DependencyProperty.Register("ZValue", GetType(Integer), GetType(UC_UpDown), New PropertyMetadata(0, New PropertyChangedCallback(AddressOf OnSomeTextPropertyChanged))) ''' <summary> ''' Se utiliza para actualizar el valor del TextBox, cuyo valor estamos manejando con Value ''' </summary> Private Shared Sub OnSomeTextPropertyChanged(target As DependencyObject, e As DependencyPropertyChangedEventArgs) Dim numericBox As UC_UpDown = TryCast(target, UC_UpDown) numericBox.textBoxNumero.Text = e.NewValue.ToString() End Sub
Este último código, lo dispara la propiedad de dependencia cada vez que cambia de valor.
Observa que está definido como [PropertyChangedCallback]
Para que esto funcione hay que interceptar el evento [TextChanged] del TextBox
#Region "Escuchadores de los eventos del TextBox interno" Private Sub Value_TextChanged(sender As Object, e As TextChangedEventArgs) Dim numericBox As TextBox = TryCast(sender, TextBox) ' Actualizar la propiedad tex del control, que a su vez llama ' a la propiedad [Value] que es una propiedad de dependencia Me.Text = numericBox.Text ' Evento tratado, no enviarlo hacia arriba e.Handled = True End Sub #End Region
Este evento se dispara cada vez que cambia el valor de la propiedad de dependencia de forma explícita llamando a la función:
Call OnValueChanged()
' ----------------------------- ' Value ZValueChanged ' ----------------------------- Private Shared ReadOnly ZValueChangedEventArgs As RoutedEvent = EventManager.RegisterRoutedEvent("ZValueChanged", RoutingStrategy.Bubble, GetType(RoutedEventHandler), GetType(UC_UpDown)) ''' <summary>El evento [ZValueChanged].</summary> Public Custom Event ZValueChanged As RoutedEventHandler AddHandler(ByVal value As RoutedEventHandler) [AddHandler](ZValueChangedEventArgs, value) End AddHandler RemoveHandler(ByVal value As RoutedEventHandler) [RemoveHandler](ZValueChangedEventArgs, value) End RemoveHandler RaiseEvent(sender As Object, e As EventArgs) End RaiseEvent End Event ''' <summary>Disparar el evento [ZValueChanged]</summary> Protected Sub OnValueChanged() [RaiseEvent](New RoutedEventArgs(ZValueChangedEventArgs)) End Sub
© 1997 - - La Güeb de Joaquín | |||||
Joaquín Medina Serrano
|
|||||
|
Codificación | |
Fecha de creación | |
Última actualización | |