绑定到DependencyProperty的Combobox'SelectedItem不会刷新

时间:2013-05-22 16:33:34

标签: wpf binding combobox dependency-properties selecteditem

我有一个组合框,其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,所以问题仍然存在......

2 个答案:

答案 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();
}