Wpf - Actualización automática de los valores de un control compuesto

Descripción general:

Tengo un control compuesto por varios controles. Necesito que cuando cambie en el código Xaml el valor de uno de los controles “hijos”, se actualice en el diseñador de forma inmediata.

Wpf - Actualización automática de los valores de un control compuesto


↑↑↑

Problema

Tengo un control compuesto por varios controles. Necesito que cuando cambie en el código Xaml el valor de uno de los controles “hijos”, se actualice en el diseñador de forma inmediata.


↑↑↑

Solución

Usar una propiedad de dependencia (DependencyProperty) y enlazar con un Binding el control que quiero que se actualice cuando cambio el valor de la propiedad.


↑↑↑

Situación de ejemplo

Quero escribir en WPF, un control que imite el comportamiento del control [NumericUpDown] de Windows Form.

Para ello, diseño un control de usuario en el que sitúo un TextBox que es el que tiene el numero y dos botones para incrementar y decrementar el numero mostrado en el TextBox.

Quiero que cuando use la propiedad Zvalue de este contro compuesto, se actualice de forma inmediata, el valor del TextBox dentro del control.


↑↑↑

Se hace así:

Código VB. Declarando la propiedad de dependencia


#Region "Propiedad de dependencia que se enlazara con la propiedad (Text) un textBox" 

    '*************************** 
    ' Apunte táctico 
    ' El control de donde se ha copiado este texto, se llama [UC_UpDown] 
    ' y es una imitación del control [NumericUpDown] de Windows Form, 
    ' escrito para se usado en una ventana WPF. 
    ' Tiene un cuadro de texto, cuyo valor value es el que se muestra. 
    ' Este código, permite usar una propiedad de dependencia con un TextBox, 
    ' y mostrar y actualizar el valor del TextBox. 
    '*************************** 

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

#End Region 

El código XAML


     <TextBox  Grid.Column="0"
                 x:Name="textBoxNumero"
               	 TextChanged="Value_TextChanged" 
                 MouseWheel="Value_MouseWheel"
                 HorizontalAlignment="Stretch" VerticalAlignment="Stretch"
                 HorizontalContentAlignment="Center" VerticalContentAlignment="Center"
                 TextWrapping="NoWrap" 
                 Text="{Binding ZValue, ElementName=userControl, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />

Observa que aquí, la propiedad Text, tiene un Binding a la propiedad de dependencia ZValue


↑↑↑

Imagen del resultado

 Para ver la imagen a su tamaño real haz Click sobre la imagen.
Imagen 01 - Resultado