Как вы можете получить доступ к 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); }
}
}