触发Loaded事件时未分配依赖属性

时间:2016-09-09 12:02:41

标签: c# wpf data-binding custom-controls dependency-properties

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

0 个答案:

没有答案