示例#1
0
 private TaggedObservableValue <TResult, int> AttachItem(TSource item)
 {
     if (item != null)
     {
         TaggedObservableValue <TResult, int> lambdaResult;
         if (!lambdas.TryGetValue(item, out lambdaResult))
         {
             lambdaResult = lambda.InvokeTagged <int>(item, 0);
             lambdaResult.ValueChanged += LambdaChanged;
             lambdas.Add(item, lambdaResult);
         }
         lambdaResult.Tag++;
         return(lambdaResult);
     }
     else
     {
         if (nullLambda == null)
         {
             nullLambda = lambda.InvokeTagged(item, 0);
             nullLambda.ValueChanged += LambdaChanged;
         }
         nullLambda.Tag++;
         return(nullLambda);
     }
 }
示例#2
0
 private TaggedObservableValue <TResult, int> AttachItem(TSource item)
 {
     if (item != null)
     {
         TaggedObservableValue <TResult, int> lambdaResult;
         if (!lambdaInstances.TryGetValue(item, out lambdaResult))
         {
             lambdaResult = lambda.InvokeTagged(item, 0);
             lambdaResult.Successors.Set(this);
             lambdaInstances.Add(item, lambdaResult);
         }
         lambdaResult.Tag++;
         return(lambdaResult);
     }
     else
     {
         if (nullLambda == null)
         {
             nullLambda = lambda.InvokeTagged(item, 0);
             nullLambda.Successors.Set(this);
         }
         nullLambda.Tag++;
         return(nullLambda);
     }
 }
示例#3
0
        private void NotifySource(CollectionChangedNotificationResult <TSource> sourceChange, List <TResult> added, List <TResult> removed)
        {
            foreach (var item in sourceChange.AllRemovedItems)
            {
                if (item != null)
                {
                    var lambdaResult = lambdaInstances[item];
                    lambdaResult.Tag--;
                    removed.Add(lambdaResult.Value);
                    if (lambdaResult.Tag == 0)
                    {
                        lambdaInstances.Remove(item);
                        lambdaResult.Successors.Unset(this);
                    }
                }
                else if (nullLambda != null)
                {
                    nullLambda.Tag--;
                    if (nullLambda.Tag == 0)
                    {
                        nullLambda.Successors.Unset(this);
                        nullLambda = null;
                    }
                }
            }

            foreach (var item in sourceChange.AllAddedItems)
            {
                var lambdaResult = AttachItem(item);
                added.Add(lambdaResult.Value);
            }
        }
示例#4
0
        private void OnLambdaValueChanged(TaggedObservableValue <TResult, int> value, ValueChangedEventArgs e)
        {
            if (e == null)
            {
                throw new ArgumentNullException("e");
            }
            TResult result    = (TResult)e.NewValue;
            TResult oldResult = (TResult)e.OldValue;

            for (int i = 0; i < value.Tag; i++)
            {
                OnUpdateItem(result, oldResult);
            }
        }
示例#5
0
 protected abstract void OnLambdaValueChanged(TaggedObservableValue <TLambdaResult, TResult> value, ValueChangedEventArgs e);
示例#6
0
 protected virtual void AttachItem(TSource sourceItem, TaggedObservableValue <TLambdaResult, TResult> lambdaValue)
 {
 }
示例#7
0
 protected abstract bool AddItem(TSource sourceItem, TaggedObservableValue <TLambdaResult, TResult> lambdaValue);
示例#8
0
        private void NotifySource(ICollectionChangedNotificationResult <TSource> sourceChange, List <TResult> added, List <TResult> removed, bool checkConflicts)
        {
            if (sourceChange.RemovedItems != null)
            {
                foreach (var item in sourceChange.RemovedItems)
                {
                    if (item != null)
                    {
                        var lambdaResult = lambdaInstances[item];
                        lambdaResult.Tag--;
                        if (checkConflicts)
                        {
                            var addIndex = added.IndexOf(lambdaResult.Value);
                            if (addIndex != -1)
                            {
                                added.RemoveAt(addIndex);
                            }
                            else
                            {
                                removed.Add(lambdaResult.Value);
                            }
                        }
                        else
                        {
                            removed.Add(lambdaResult.Value);
                        }
                        if (lambdaResult.Tag == 0)
                        {
                            lambdaInstances.Remove(item);
                            lambdaResult.Successors.Unset(this);
                        }
                    }
                    else if (nullLambda != null)
                    {
                        nullLambda.Tag--;
                        if (nullLambda.Tag == 0)
                        {
                            nullLambda.Successors.Unset(this);
                            nullLambda = null;
                        }
                    }
                }
            }

            if (sourceChange.AddedItems != null)
            {
                foreach (var item in sourceChange.AddedItems)
                {
                    var lambdaResult = AttachItem(item);
                    if (checkConflicts)
                    {
                        var removeIndex = removed.IndexOf(lambdaResult.Value);
                        if (removeIndex != -1)
                        {
                            removed.RemoveAt(removeIndex);
                        }
                        else
                        {
                            added.Add(lambdaResult.Value);
                        }
                    }
                    else
                    {
                        added.Add(lambdaResult.Value);
                    }
                }
            }
        }
示例#9
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 <TResult>();
             foreach (TSource item in e.OldItems)
             {
                 if (item != null)
                 {
                     TaggedObservableValue <TResult, int> lambdaResult;
                     if (lambdas.TryGetValue(item, out lambdaResult))
                     {
                         lambdaResult.Tag--;
                         if (lambdaResult.Tag == 0)
                         {
                             lambdas.Remove(item);
                             lambdaResult.ValueChanged -= LambdaChanged;
                             lambdaResult.Detach();
                         }
                         removed.Add(lambdaResult.Value);
                     }
                     else
                     {
                         throw new InvalidOperationException();
                     }
                 }
                 else if (nullLambda != null)
                 {
                     nullLambda.Tag--;
                     if (nullLambda.Tag == 0)
                     {
                         nullLambda.ValueChanged -= LambdaChanged;
                         nullLambda.Detach();
                         nullLambda = null;
                     }
                 }
             }
             OnRemoveItems(removed, e.OldStartingIndex);
         }
         if (e.NewItems != null)
         {
             var added = new List <TResult>();
             foreach (TSource item in e.NewItems)
             {
                 var lambdaResult = AttachItem(item);
                 added.Add(lambdaResult.Value);
             }
             OnAddItems(added, e.NewStartingIndex);
         }
     }
     else
     {
         DetachSource();
         OnCleared();
     }
 }