绑定仅在调用事件时应用于源
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);
}
当 ItemDictionary
在 EndInit
中更新时。绑定 属性 不会更新。
一旦我在事件方法中调用它,我的更改就会突然影响源。
我做了一些测试,看看我的绑定是否被创建为 EndInit
,但在我的视图模型的构造函数中将 属性 设置为 null。因此,即使绑定有效并且它调用 OnItemDictionaryPropertyChanged
。源代码中没有任何变化。
我错过了什么?
我猜这可能是应用程序生命周期问题。也许 EndInit() 在 ItemDictionaryProperty
与 FrameworkPropertyMetaData
中的 new Dictionary<string, Control>()
设置之前被调用。 EndInit() 似乎只与控件的图形部分有关。 MSDN for ISupportInitialize.EndInit
尝试使用 Loaded
事件。 Info on MSDN
我有一个具有依赖关系的自定义控件 属性。当在 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);
}
当 ItemDictionary
在 EndInit
中更新时。绑定 属性 不会更新。
一旦我在事件方法中调用它,我的更改就会突然影响源。
我做了一些测试,看看我的绑定是否被创建为 EndInit
,但在我的视图模型的构造函数中将 属性 设置为 null。因此,即使绑定有效并且它调用 OnItemDictionaryPropertyChanged
。源代码中没有任何变化。
我错过了什么?
我猜这可能是应用程序生命周期问题。也许 EndInit() 在 ItemDictionaryProperty
与 FrameworkPropertyMetaData
中的 new Dictionary<string, Control>()
设置之前被调用。 EndInit() 似乎只与控件的图形部分有关。 MSDN for ISupportInitialize.EndInit
尝试使用 Loaded
事件。 Info on MSDN