Wie kann während der Initialisierung auf XAML-Eigenschaften eines UserControl zugegriffen werden?

Wir schreiben ein benutzerdefiniertes UserControl (im Gegensatz zu einem nicht sichtbaren Steuerelement) und müssen eine Initialisierung basierend auf den Eigenschaften durchführen, die unsere Konsumenten für unser Steuerelement in XAML festgelegt haben.

In den meisten Fällen würden Sie jetzt das Initialized-Ereignis (oder die OnInitialized-Überschreibung) verwenden, da zum Zeitpunkt des Auslösens alle XAML-Set-Eigenschaften angewendet wurden. Bei einem UserControl ist dies jedoch nicht der Fall. Wenn das Initialized-Ereignis ausgelöst wird, haben alle Eigenschaften weiterhin ihre Standardwerte.

Ich habe dies nicht für andere Steuerelemente bemerkt, nur für UserControls, die sich dadurch unterscheiden, dass sie in ihrem Konstruktor InitializeComponent () aufrufen. Als Test habe ich diese Zeile auskommentiert und den Code ausgeführt, diesmal während der Initialisierung Event, die Eigenschaftenwurden einstellen.

Hier sind einige Code- und Testergebnisse, die dies demonstrieren ...

Ergebnis mit InitializeComponent im Konstruktor aufgerufen:
(Hinweis: Die Werte sind noch nicht eingestellt)

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

Ergebnis mit vollständig auskommentierter InitializeComponent:
(Hinweis: Während die Werte festgelegt wurden, wird das Steuerelement nicht geladen, da es InitializeComponent benötigt.)

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

Wie kann ich mein Steuerelement basierend auf benutzerdefinierten Eigenschaften in der XAML initialisieren? (Hinweis: Das Laden ist zu spät, da das Steuerelement bis dahin bereits initialisiert sein sollte.)

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

}

Antworten auf die Frage(2)

Ihre Antwort auf die Frage