2017-08-15 78 views
0

我有,有一个依赖属性的用户控件:WPF绑定依赖物业的ObservableCollection

public static readonly DependencyProperty MasterListProperty = DependencyProperty.Register("MasterList", typeof(IEnumerable<MyObject>), typeof(MyControl), new FrameworkPropertyMetadata(null, new PropertyChangedCallback(MasterListChanged))); 

我的目标实现INotifyPropertyChanged。我试图将这个依赖属性绑定到该对象的ObservableCollection。但是我没有得到任何更新,当我添加一个项目到我的根集合,这个依赖属性绑定。

下面是被这种依赖属性绑定到我的收藏控制:我试图把Mode=TwoWay,仍然没有得到任何更新我的依赖属性

<image:MyControl MasterList="{Binding Path=SourceList, UpdateSourceTrigger=PropertyChanged}"></image:MyControl> 

。我有一个绑定到依赖项属性数的工具提示,它会被更新,但是我的MasterListChanged事件没有被激发。

任何想法?

+0

你有没有改变'SourceList'?如果MasterListChanged不叫的话,我认为答案是当MyObject的被添加到的ObservableCollection“不” – ASh

+2

你PropertyChangedCallback不会被调用。当依赖属性被设置为一个新的IEnumerable (的ObservableCollection )它只会被调用。 – mm8

+0

@ASh当我添加一个项目,我将它SOURCELIST – James

回答

4

但我没有得到任何更新,当我将项目添加到我的根集合,这种依赖属性绑定到。

你不应该。一个依赖属性的PropertyChangedCallback当依赖属性本身被设置为一个新值时才会激活。当您将MyObject添加到源集合时,它不会被调用。

你可以做的是处理CollectionChanged事件集合,如果你想在一个项目中添加或删除它做一些事情,例如:

private static void MasterListChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
{ 
    var newCol = e.NewValue as INotifyCollectionChanged; 
    if (newCol != null) 
    { 
     newCol.CollectionChanged += Coll_CollectionChanged; 
    } 

    var oldCol = e.OldValue as INotifyCollectionChanged; 
    if (oldCol != null) 
    { 
     oldCol.CollectionChanged -= Coll_CollectionChanged; 
    } 
} 

private static void Coll_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e) 
{ 
    //do something... 
} 
+1

建议将转换语句更改为'e.NewValue作为INotifyCollectionChanged'和'e.OldValue作为INotifyCollectionChanged' – Ada

+0

@SharadaGururaj背后的理由是什么? – James

+0

INotifyCollectionChanged比的ObservableCollection ,即相同的代码可与超过一种类型的特异性较低。我更新了答案。 – mm8