[Wpf] - DependencyProperty y Eventos enrutados

Descripción general

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.

[TOC] Tabla de Contenidos


↑↑↑

1.1 Introducción

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.


↑↑↑

1.2 DependencyProperty Normal

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))


↑↑↑

1.3 DependencyProperty usando el valor de un TextBox

Una propiedad [Valor], que representa el valor numérico de un control [TextBox]


↑↑↑

1.3.1 El valor de la propiedad Text Sobrescrito

''' <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


↑↑↑

1.3.2 La propiedad Valor DependencyProperty

''' <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]


↑↑↑

1.3.3 El evento [TextChanged] del TextBox

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


↑↑↑

1.3.4 Falta por declarar el evento enrutado [ValueChanged]

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

↑↑↑

A.2.Enlaces

[Para saber mas]
[Grupo de documentos]
[Documento Index]
[Documento Start]
[Imprimir el Documento]
© 1997 - - La Güeb de Joaquín
Joaquín Medina Serrano
Ésta página es española

Codificación
Fecha de creación
Última actualización
[HTML5 Desarrollado usando CSS3]