1

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

4

2 回答 2

3

来自MSDN

除特殊情况外,您的包装器实现应仅分别执行 GetValue 和 SetValue 操作。其原因在主题 XAML 加载和依赖属性中进行了讨论。

那里你可以阅读

WPF XAML 处理器在加载二进制 XAML 和处理作为依赖属性的属性时使用属性系统方法来处理依赖属性。这有效地绕过了属性包装器。

于 2013-05-22T16:49:33.437 回答
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();
}
于 2013-05-22T16:53:27.280 回答