Beispiel #1
0
        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);
                    }
                }
            }
        }
Beispiel #2
0
 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();
     }
 }