2017-08-15 79 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