CollectionChanged вызывается только при изменении коллекции, если коллекция уже заполнена до ее установки, вы никогда не получите уведомление, пока что-то не будет добавлено / удалено.
Во-вторых, если вы устанавливаете свойство зависимости из xaml, то метод получения / установки не используется, механизм зависимости использует свои собственные внутренние процедуры установки. Вы должны прикрепить событие collectionChanged в функцию обратного вызова свойства ChangeGraphs, так как она вызывается всякий раз, когда свойство устанавливается / изменяется. Вы также можете использовать это, чтобы отсоединить старое событие collectionChanged, аргументы события приведут к старому и новому значению.
Но на самом деле, это наблюдаемая коллекция, которую вы не должны знать, когда коллекция изменяется, поскольку вы должны привязывать коллекцию и когда она изменится, механизм привязки обновит ваш интерфейс.
Я бы изменил свой код, чтобы он выглядел следующим образом
public ObservableCollection<GraphViewModel> ItemsSource {
get { return (ObservableCollection<GraphViewModel>)GetValue(ItemsSourceProperty); }
set { SetValue(ItemsSourceProperty, value); }
}
// Using a DependencyProperty as the backing store for ItemsSource. This enables animation, styling, binding, etc...
public static readonly DependencyProperty ItemsSourceProperty =
DependencyProperty.Register("ItemsSource", typeof(ObservableCollection<GraphViewModel>), typeof(DynamicPlotter), new UIPropertyMetadata(null, (o, e) => { ((DynamicPlotter)o).ItemsSourceChanged(); }));
private void ItemsSourceChanged() {
if (this.ItemsSource != null){
//attach the collection changed listener, this will listen to all FUTURE collection changes, items that are added and removed
this.ItemsSource.CollectionChanged +=new NotifyCollectionChangedEventHandler(ItemsSource_CollectionChanged);
//do some inital processing with the items that are in the collection already when it is set
this.UpdateGraphs(this.ItemsSource);
}
private void ItemsSource_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e){
//this will get called if an item gets added or removed from the collection
}