private void DetachItem(SortedDictionary <TKey, ObservableCollection <TItem> > searchTree, TItem item) { Stack <TaggedObservableValue <TKey, SequenceInfo> > lambdaStack; if (lambdaResults.TryGetValue(item, out lambdaStack)) { var lambdaResult = lambdaStack.Pop(); lambdaResult.ValueChanged -= KeySelectorValueChanged; lambdaResult.Detach(); if (lambdaStack.Count == 0) { lambdaResults.Remove(item); } ObservableCollection <TItem> itemSequence; if (searchTree.TryGetValue(lambdaResult.Value, out itemSequence)) { itemSequence.Remove(item); if (itemSequence.Count == 0) { searchTree.Remove(lambdaResult.Value); manualNotifier.NotifyRemoveItem(itemSequence); } } } }
private void SourceCollectionChanged(object sender, NotifyCollectionChangedEventArgs e) { if (e.Action == NotifyCollectionChangedAction.Move) { return; } if (e.Action != NotifyCollectionChangedAction.Reset) { if (e.OldItems != null) { var removed = new List <TItem>(); foreach (TItem item in e.OldItems) { TaggedObservableValue <TKey, Multiplicity <TItem> > lambdaResult; if (lambdas.TryGetValue(item, out lambdaResult)) { ObservableCollection <TItem> sequence; if (searchTree.TryGetValue(lambdaResult.Value, out sequence)) { sequence.Remove(item); if (sequence.Count == 0) { searchTree.Remove(lambdaResult.Value); manualRaiseSequences.NotifyRemoveItem(sequence); } } removed.Add(lambdaResult.Tag.Item); lambdaResult.Tag = new Multiplicity <TItem>(lambdaResult.Tag.Item, lambdaResult.Tag.Count - 1); if (lambdaResult.Tag.Count == 0) { lambdaResult.ValueChanged -= LambdaChanged; lambdaResult.Detach(); lambdas.Remove(item); } } else { //throw new InvalidOperationException(); } } OnRemoveItems(removed); } if (e.NewItems != null) { var added = new List <TItem>(); foreach (TItem item in e.NewItems) { AttachItem(item); added.Add(item); } OnAddItems(added); } } else { DetachSource(); foreach (var item in source) { AttachItem(item); } OnCleared(); } }