我有一个组合框,其SelectedItem绑定到依赖属性。
public IEnumerable<KeyValuePair<int,string>> AllItems
{
get { return _AllItems; }
set
{
_AllItems = value;
this.NotifyChange(() => AllItems);
}
}
public KeyValuePair<int, string> SelectedStuff
{
get { return (KeyValuePair<int, string>)GetValue(SelectedStuffProperty); }
set
{
SetValue(SelectedStuffProperty, value);
LoadThings();
}
}
public static readonly DependencyProperty SelectedStuffProperty =
DependencyProperty.Register("SelectedStuff", typeof(KeyValuePair<int, string>), typeof(MyUserControl), new UIPropertyMetadata(default(KeyValuePair<int, string>)));
和xaml:
<ComboBox DisplayMemberPath="Value"
ItemsSource="{Binding AllItems}"
SelectedItem="{Binding SelectedStuff, Mode=TwoWay}" />
数据被正确绑定并显示,但当我在组合框中选择另一个值时,set
未被调用,我的LoadThings()
方法也未被调用。
有明显的原因吗?
提前致谢
我使用snoop来查看组合框内部,当我更改值时,组合框'SelectedItem也会被更改。
我还检查了代码,并且属性已更改。但我的方法没有被调用(因为我没有通过set
,所以问题仍然存在......
答案 0 :(得分:3)
来自MSDN
除了特殊情况外,你的包装实现 应分别仅执行GetValue和SetValue操作。 其原因在XAML Loading和主题中讨论 依赖属性。
there你可以阅读
WPF XAML处理器使用属性系统方法进行依赖 加载二进制XAML和处理属性时的属性 依赖属性。这有效地绕过了财产 包装
答案 1 :(得分:0)
好的,我发现了怎么做。
我使用像这样的回调的重载来声明我的DependencyProperty:
public static readonly DependencyProperty SelectedStuffProperty =
DependencyProperty.Register("SelectedStuff", typeof(KeyValuePair<int, string>), typeof(MyUserControl), new UIPropertyMetadata(default(KeyValuePair<int, string>), new PropertyChangedCallback(SelectedStuffChanged));
在回调中,我这样做:
private static void SelectedStuffChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
MyUserControl c = d as MyUserControl;
c.LoadThings();
}