绑定仅在调用事件时应用于源

Binding only gets applied to source when event is invoked

我有一个具有依赖关系的自定义控件 属性。当在 Dependency 属性 上调用 SetValue 时,除非在触发 UI 事件后调用 SetValue,否则什么也不会发生。看看下面的例子,看看我的意思。

public static readonly DependencyProperty ItemDictionaryProperty = DependencyProperty.Register("ItemDictionary", typeof(Dictionary<string, Control>), typeof(ListBoxEx),
        new FrameworkPropertyMetadata(new Dictionary<string, Control>(),     FrameworkPropertyMetadataOptions.SubPropertiesDoNotAffectRender, OnItemDictionaryPropertyChanged));

    private Dictionary<string, Control> itemDictionary = new Dictionary<string, Control>();

    private static void OnItemDictionaryPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        var test = (ListBoxEx)d;
        test.ItemDictionary = (Dictionary<string, object>)e.NewValue;
       // test.GetBindingExpression(ItemDictionaryProperty).UpdateSource();
    }

    public override void EndInit()
    {
        itemDictionary.Clear();
        foreach (var item in this.Items)
            itemDictionary.Add((item as Control).Tag.ToString(), item as Control);

        this.ItemDictionary = itemDictionary; // This doesn't

        base.EndInit();
    }

    public Dictionary<string, Control> ItemDictionary
    {
        get { return (Dictionary<string, Control>)GetValue(ItemDictionaryProperty); }
        set  { SetValue(ItemDictionaryProperty, value); }
    }

    protected override void OnMouseLeftButtonDown(System.Windows.Input.MouseButtonEventArgs e)
    {
        itemDictionary.Clear();
        foreach (var item in this.Items)
            itemDictionary.Add((item as Control).Tag.ToString(), item as Control);

        ItemDictionary = itemDictionary; // This works
        base.OnMouseLeftButtonDown(e);
    }

ItemDictionaryEndInit 中更新时。绑定 属性 不会更新。 一旦我在事件方法中调用它,我的更改就会突然影响源。

我做了一些测试,看看我的绑定是否被创建为 EndInit,但在我的视图模型的构造函数中将 属性 设置为 null。因此,即使绑定有效并且它调用 OnItemDictionaryPropertyChanged。源代码中没有任何变化。

我错过了什么?

我猜这可能是应用程序生命周期问题。也许 EndInit() 在 ItemDictionaryPropertyFrameworkPropertyMetaData 中的 new Dictionary<string, Control>() 设置之前被调用。 EndInit() 似乎只与控件的图形部分有关。 MSDN for ISupportInitialize.EndInit

尝试使用 Loaded 事件。 Info on MSDN