using System.Collections.Generic; using System.Collections.ObjectModel; using System.Collections.Specialized; using System.ComponentModel; using System.Linq; using BS.Shared.Extensions; namespace BS.Shared.Core { public sealed class TrulyObservableCollection : ObservableCollection where T : INotifyPropertyChanged { public TrulyObservableCollection() { CollectionChanged += TrulyObservableCollection_CollectionChanged; } public TrulyObservableCollection(IEnumerable collection) { CollectionChanged += TrulyObservableCollection_CollectionChanged; this.AddRange(collection); } void TrulyObservableCollection_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e) { if (e.NewItems != null) { foreach (var notifyPropertyChanged in e.NewItems.OfType()) { notifyPropertyChanged.PropertyChanged += item_PropertyChanged; } } if (e.OldItems == null) return; foreach (var notifyPropertyChanged in e.OldItems.OfType()) { notifyPropertyChanged.PropertyChanged -= item_PropertyChanged; } } void item_PropertyChanged(object sender, PropertyChangedEventArgs e) { var a = new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset); OnCollectionChanged(a); } } }