private void HandleItemAdded(int newStartingIndex, object newItem) { if (_filter != null && !_filter(newItem)) { return; } if (_sortDescriptions.Any()) { _sortProperties.Clear(); newStartingIndex = _view.BinarySearch(newItem, this); if (newStartingIndex < 0) { newStartingIndex = ~newStartingIndex; } } else if (_filter != null) { if (_sourceList == null) { HandleSourceChanged(); return; } var visibleBelowIndex = 0; for (int i = newStartingIndex; i < _sourceList.Count; i++) { if (!_filter(_sourceList[i])) { visibleBelowIndex++; } } newStartingIndex = _view.Count - visibleBelowIndex; } _view.Insert(newStartingIndex, newItem); if (newStartingIndex <= _index) { _index++; } var e = new VectorChangedEventArgs(CollectionChange.ItemInserted, newStartingIndex, newItem); OnVectorChanged(e); }
private void HandleItemRemoved(int oldStartingIndex, object oldItem) { if (_filter != null && !_filter(oldItem)) { return; } if (oldStartingIndex < 0 || oldStartingIndex >= _view.Count || !Equals(_view[oldStartingIndex], oldItem)) { oldStartingIndex = _view.IndexOf(oldItem); } if (oldStartingIndex < 0) { return; } _view.RemoveAt(oldStartingIndex); if (oldStartingIndex <= _index) { _index--; } var e = new VectorChangedEventArgs(CollectionChange.ItemRemoved, oldStartingIndex, oldItem); OnVectorChanged(e); }