es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Existe alguna manera de inicializar un UserControl una vez que se han pasado todas las propiedades en él?

Actualmente estoy creando una aplicación WPF, y he notado algo un poco extraño. Parece haber un retraso al pasar datos a un UserControl mediante propiedades.

public partial class TestControl : UserControl
{
    public string Subject { get; set; } = "Foo";

    public TestControl()
    {
        InitializeComponent();
        DataContext = this;
        Start();
    }

    public async Task Start()
    {
        Debug.WriteLine("El asunto es: " + Subject);
        await Task.Delay(1);
        Debug.WriteLine("El asunto es: " + Subject);
    }
}

En la ventana principal establezco la propiedad Subject del UserControl:

<window x:class="TestApplication.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:local="clr-namespace:TestApplication" xmlns:views="clr-namespace:TestApplication.Views" mc:ignorable="d" title="MainWindow" height="450" width="800">
    <grid>
        <views:testcontrol subject="Bar"></views:testcontrol>
    </grid>
</window>

En la salida obtengo el valor predeterminado “Foo”, y 1 milisegundo después obtengo “Bar”.

El asunto es: Foo
El asunto es: Bar
“`

¿Hay alguna forma de garantizar la inicialización del componente con el valor pasado en lugar del valor predeterminado sin agregar artificialmente algún retraso para que funcione?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Sí, hay una forma de garantizar la inicialización del componente con el valor pasado en lugar del valor predeterminado sin agregar artificialmente un retraso. Puede utilizar el evento Loaded del UserControl para asegurarse de que el valor pasado se inicialice antes de que se ejecute cualquier otro código.

    En el código del lado del servidor del UserControl, agregue el siguiente código:

    private void UserControl_Loaded(object sender, RoutedEventArgs e)
    {
    Debug.WriteLine("El tema es: " + Subject);
    }

    Esto asegurará que la propiedad Subject se inicialice con el valor pasado antes de que se ejecute cualquier otro código.

Comments are closed.