Como você pode acessar as propriedades do conjunto de XAML de um UserControl durante a inicialização?

Estamos escrevendo um UserControl personalizado (em oposição a um controle sem aparência) e precisamos executar alguma inicialização com base nas propriedades que nossos consumidores definem em nosso controle no XAML.

Agora, na maioria dos casos, você usaria o evento Initialized (ou a substituição OnInitialized), uma vez que, no momento em que é acionado, todas as propriedades do conjunto de XAML foram aplicadas, mas no caso de um UserControl, esse não é o caso. Quando o evento inicializado é acionado, todas as propriedades ainda estão em seus valores padrão.

Eu não percebi isso para outros controles, apenas UserControls, que são diferentes em que eles chamam InitializeComponent () em seu construtor, assim como um teste, eu comentei essa linha e executei o código e com certeza, desta vez durante o Initialized evento, as propriedadesestavam conjunto.

Aqui estão alguns códigos e resultados de testes demonstrando isso ...

Resultado com InitializeComponent chamado no construtor:
(Nota: os valores ainda não foram definidos)

TestValue (Pre-OnInitialized): Original Value
TestValue (Initialized Event): Original Value
TestValue (Post-OnInitialized): Original Value

Resultado com InitializeComponent completamente comentado:
(Nota: Enquanto os valores foram definidos, o controle não está carregado, pois precisa de InitializeComponent)

TestValue (Pre-OnInitialized): New Value!
TestValue (Initialized Event): New Value!
TestValue (Post-OnInitialized): New Value! // Event *was* called and the property has been changed

Tudo isso dito, o que posso usar para inicializar meu controle com base nas propriedades definidas pelo usuário no XAML? (Nota: Loaded é tarde demais, já que o controle já deveria ter sido inicializado.)

Snippet XAML

<local:TestControl TestValue="New Value!" />

TestControl.cs

public partial class TestControl : UserControl
{
    public TestControl()
    {
        this.Initialized += TestControl_Initialized;
        InitializeComponent();
    }

    protected override void OnInitialized(EventArgs e)
    {
        Console.WriteLine("TestValue (Pre-OnInitialized): " + TestValue);
        base.OnInitialized(e);
        Console.WriteLine("TestValue (Post-OnInitialized): " + TestValue);
    }

    void TestControl_Initialized(object sender, EventArgs e)
    {
        Console.WriteLine("TestValue (Initialized Event): " + TestValue);
    }

    public static readonly DependencyProperty TestValueProperty = DependencyProperty.Register(
        "TestValue",
        typeof(string),
        typeof(TestControl),
        new UIPropertyMetadata("Original Value"));

    public string TestValue
    {
        get { return (string)GetValue(TestValueProperty); }
        set { SetValue(TestValueProperty, value); }
    }

}

questionAnswers(2)

yourAnswerToTheQuestion