private void OnDataSourcesChanged(IEnumerable <IDataSourceViewModel> oldValue, IEnumerable <IDataSourceViewModel> newValue) { var old = oldValue as INotifyCollectionChanged; if (old != null) { old.CollectionChanged -= ItemsSourceOnCollectionChanged; } FilteredItemsSource.Clear(); if (newValue != null) { foreach (IDataSourceViewModel model in newValue) { if (PassesFilter(model)) { FilteredItemsSource.Add(model); } } var @new = newValue as INotifyCollectionChanged; if (@new != null) { @new.CollectionChanged += ItemsSourceOnCollectionChanged; } } }
private void ItemsSourceOnCollectionChanged(object sender, NotifyCollectionChangedEventArgs e) { switch (e.Action) { case NotifyCollectionChangedAction.Add: for (var i = 0; i < e.NewItems.Count; ++i) { var model = (IDataSourceViewModel)e.NewItems[i]; if (PassesFilter(model)) { var sourceIndex = e.NewStartingIndex + i; var filteredIndex = FindFilteredIndex(sourceIndex); FilteredItemsSource.Insert(filteredIndex, model); } } break; case NotifyCollectionChangedAction.Remove: foreach (IDataSourceViewModel model in e.OldItems) { FilteredItemsSource.Remove(model); } break; case NotifyCollectionChangedAction.Reset: FilteredItemsSource.Clear(); break; default: throw new NotImplementedException(); } UpdateNoDataSourcesMessage(); }