MainWindow
正在使用自定义控件:
<Window ... >
<wpfCustomControlLibrary1:CustomControl Parameter="{Binding ParameterValue}" />
</Window>
MainWindow
的视图模型包含ParameterValue
用于绑定:
internal class MainViewModel
{
private string parameterValue;
public MainViewModel()
{
this.ParameterValue = "Test";
}
public string ParameterValue
{
get { return this.parameterValue; }
set
{
this.parameterValue = value;
$"Setter: {value != null}".TraceTime();
}
}
}
在自定义控件中,我需要在Loaded
事件处理程序中执行其他操作,为此我需要Parameter
值:
public class CustomControl : Control
{
static CustomControl()
{
DefaultStyleKeyProperty.OverrideMetadata(typeof(CustomControl), new FrameworkPropertyMetadata(typeof(CustomControl)));
}
public CustomControl()
{
this.Loaded += this.OnLoaded;
}
private void OnLoaded(object sender, RoutedEventArgs routedEventArgs)
{
// HERE I need to use Parameter value
$"OnLoaded: {this.Parameter != null}".TraceTime();
}
public static readonly DependencyProperty ParameterProperty =
DependencyProperty.Register("Parameter", typeof(string), typeof(CustomControl), new PropertyMetadata(null, PropertyChangedCallback));
private static void PropertyChangedCallback(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs dependencyPropertyChangedEventArgs)
{
$"DP: {dependencyPropertyChangedEventArgs.NewValue != null}".TraceTime();
}
}
但是当Loaded
事件触发时,Parameter
值仍然为空。这是跟踪输出:
[14:24:13.961]塞特:真的 [14:24:14.173] OnLoaded:False
[14:24:14.235] DP:是的
您可以看到,尽管已经设置了实际ParameterValue
,但Parameter
依赖项属性会在延迟时对其进行评估,并在 OnLoaded
触发后进行。
我可以使用哪些自定义控件事件来确保评估所有依赖项属性?
我可以使用PropertyChangedCallback
进行初始化,但如果我有几个参数,它会变得更复杂。
顺便说一句,当值直接分配Parameter="Test"
时,没有延迟,但我需要绑定。
public static void TraceTime(this object value)
{
System.Diagnostics.Trace.WriteLine($"[{DateTime.Now.ToString("HH:mm:ss.fff")}] {value}");
}