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); } }
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); } }
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); } }
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); } }
protected abstract void OnLambdaValueChanged(TaggedObservableValue <TLambdaResult, TResult> value, ValueChangedEventArgs e);
protected virtual void AttachItem(TSource sourceItem, TaggedObservableValue <TLambdaResult, TResult> lambdaValue) { }
protected abstract bool AddItem(TSource sourceItem, TaggedObservableValue <TLambdaResult, TResult> lambdaValue);
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); } } } }
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(); } }