Как вы можете получить доступ к XAML-установленным свойствам UserControl во время инициализации?

Мы пишем пользовательский элемент управления UserControl (в отличие от элемента управления без внешнего вида), и нам необходимо выполнить некоторую инициализацию, основанную на том, какие свойства наши потребители задают для нашего элемента управления в XAML.

Теперь в большинстве случаев вы будете использовать событие Initialized (или переопределение OnInitialized), поскольку к моменту запуска все свойства набора XAML уже были применены, но в случае UserControl это не так. Когда инициируется событие Initialized, все свойства по-прежнему имеют свои значения по умолчанию.

Я не заметил этого для других элементов управления, только для UserControls, которые отличаются тем, что они вызывают InitializeComponent () в своем конструкторе, поэтому в качестве теста я прокомментировал эту строку и выполнил код и, конечно же, на этот раз во время Initialized событие, свойствамы установлен.

Вот код и результаты тестов, демонстрирующие это ...

Результат с InitializeComponent, вызванным в конструкторе:
(Примечание: значения все еще не были установлены)

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

Результат с InitializeComponent полностью закомментирован:
(Примечание. Несмотря на то, что значения установлены, элемент управления не загружается, так как для него требуется 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

Все это говорит о том, что я могу использовать для инициализации моего элемента управления на основе пользовательских свойств в XAML? (Примечание: загружен слишком поздно, так как к тому времени элемент управления уже должен был быть инициализирован.)

XAML Snippet

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

}

Ответы на вопрос(2)

Ваш ответ на вопрос