ISynchronizedViewFilter.OnCollectionChanged receives NCCEARGS

This commit is contained in:
neuecc 2021-09-22 16:15:43 +09:00
parent c2d1cf1989
commit 09ebd9aba4
26 changed files with 159 additions and 152 deletions

View File

@ -1,11 +1,12 @@
<Project Sdk="Microsoft.NET.Sdk.Web"> <Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup> <PropertyGroup>
<TargetFramework>net6.0</TargetFramework> <TargetFramework>net6.0</TargetFramework>
</PropertyGroup> <ImplicitUsings>enable</ImplicitUsings>
</PropertyGroup>
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\..\src\ObservableCollections\ObservableCollections.csproj" /> <ProjectReference Include="..\..\src\ObservableCollections\ObservableCollections.csproj" />
</ItemGroup> </ItemGroup>
</Project> </Project>

View File

@ -7,7 +7,7 @@ namespace ObservableCollections
bool IsMatch(T value, TView view); bool IsMatch(T value, TView view);
void WhenTrue(T value, TView view); void WhenTrue(T value, TView view);
void WhenFalse(T value, TView view); void WhenFalse(T value, TView view);
void OnCollectionChanged(ChangedKind changedKind, T value, TView view); void OnCollectionChanged(ChangedKind changedKind, T value, TView view, in NotifyCollectionChangedEventArgs<T> eventArgs);
} }
public enum ChangedKind public enum ChangedKind
@ -35,14 +35,14 @@ namespace ObservableCollections
public bool IsMatch(T value, TView view) => isMatch(value, view); public bool IsMatch(T value, TView view) => isMatch(value, view);
public void WhenFalse(T value, TView view) => whenFalse?.Invoke(value, view); public void WhenFalse(T value, TView view) => whenFalse?.Invoke(value, view);
public void WhenTrue(T value, TView view) => whenTrue?.Invoke(value, view); public void WhenTrue(T value, TView view) => whenTrue?.Invoke(value, view);
public void OnCollectionChanged(ChangedKind changedKind, T value, TView view) => onCollectionChanged?.Invoke(changedKind, value, view); public void OnCollectionChanged(ChangedKind changedKind, T value, TView view, in NotifyCollectionChangedEventArgs<T> eventArgs) => onCollectionChanged?.Invoke(changedKind, value, view);
class NullViewFilter : ISynchronizedViewFilter<T, TView> class NullViewFilter : ISynchronizedViewFilter<T, TView>
{ {
public bool IsMatch(T value, TView view) => true; public bool IsMatch(T value, TView view) => true;
public void WhenFalse(T value, TView view) { } public void WhenFalse(T value, TView view) { }
public void WhenTrue(T value, TView view) { } public void WhenTrue(T value, TView view) { }
public void OnCollectionChanged(ChangedKind changedKind, T value, TView view) { } public void OnCollectionChanged(ChangedKind changedKind, T value, TView view, in NotifyCollectionChangedEventArgs<T> eventArgs) { }
} }
} }
@ -68,12 +68,12 @@ namespace ObservableCollections
return filter == SynchronizedViewFilter<T, TView>.Null; return filter == SynchronizedViewFilter<T, TView>.Null;
} }
internal static void InvokeOnAdd<T, TView>(this ISynchronizedViewFilter<T, TView> filter, (T value, TView view) value) internal static void InvokeOnAdd<T, TView>(this ISynchronizedViewFilter<T, TView> filter, (T value, TView view) value, in NotifyCollectionChangedEventArgs<T> eventArgs)
{ {
InvokeOnAdd(filter, value.value, value.view); InvokeOnAdd(filter, value.value, value.view, eventArgs);
} }
internal static void InvokeOnAdd<T, TView>(this ISynchronizedViewFilter<T, TView> filter, T value, TView view) internal static void InvokeOnAdd<T, TView>(this ISynchronizedViewFilter<T, TView> filter, T value, TView view, in NotifyCollectionChangedEventArgs<T> eventArgs)
{ {
if (filter.IsMatch(value, view)) if (filter.IsMatch(value, view))
{ {
@ -83,27 +83,27 @@ namespace ObservableCollections
{ {
filter.WhenFalse(value, view); filter.WhenFalse(value, view);
} }
filter.OnCollectionChanged(ChangedKind.Add, value, view); filter.OnCollectionChanged(ChangedKind.Add, value, view, eventArgs);
} }
internal static void InvokeOnRemove<T, TView>(this ISynchronizedViewFilter<T, TView> filter, (T value, TView view) value) internal static void InvokeOnRemove<T, TView>(this ISynchronizedViewFilter<T, TView> filter, (T value, TView view) value, in NotifyCollectionChangedEventArgs<T> eventArgs)
{ {
InvokeOnRemove(filter, value.value, value.view); InvokeOnRemove(filter, value.value, value.view, eventArgs);
} }
internal static void InvokeOnRemove<T, TView>(this ISynchronizedViewFilter<T, TView> filter, T value, TView view) internal static void InvokeOnRemove<T, TView>(this ISynchronizedViewFilter<T, TView> filter, T value, TView view, in NotifyCollectionChangedEventArgs<T> eventArgs)
{ {
filter.OnCollectionChanged(ChangedKind.Remove, value, view); filter.OnCollectionChanged(ChangedKind.Remove, value, view, eventArgs);
} }
internal static void InvokeOnMove<T, TView>(this ISynchronizedViewFilter<T, TView> filter, (T value, TView view) value) internal static void InvokeOnMove<T, TView>(this ISynchronizedViewFilter<T, TView> filter, (T value, TView view) value, in NotifyCollectionChangedEventArgs<T> eventArgs)
{ {
InvokeOnMove(filter, value.value, value.view); InvokeOnMove(filter, value.value, value.view, eventArgs);
} }
internal static void InvokeOnMove<T, TView>(this ISynchronizedViewFilter<T, TView> filter, T value, TView view) internal static void InvokeOnMove<T, TView>(this ISynchronizedViewFilter<T, TView> filter, T value, TView view, in NotifyCollectionChangedEventArgs<T> eventArgs)
{ {
filter.OnCollectionChanged(ChangedKind.Move, value, view); filter.OnCollectionChanged(ChangedKind.Move, value, view, eventArgs);
} }
internal static void InvokeOnAttach<T, TView>(this ISynchronizedViewFilter<T, TView> filter, T value, TView view) internal static void InvokeOnAttach<T, TView>(this ISynchronizedViewFilter<T, TView> filter, T value, TView view)

View File

@ -3,6 +3,7 @@ using System.Buffers;
using System.Collections; using System.Collections;
using System.Collections.Generic; using System.Collections.Generic;
using System.Runtime.CompilerServices; using System.Runtime.CompilerServices;
using System.Linq;
namespace ObservableCollections.Internal namespace ObservableCollections.Internal
{ {

View File

@ -122,7 +122,7 @@ namespace ObservableCollections.Internal
var view = transform(value); var view = transform(value);
var id = identitySelector(value); var id = identitySelector(value);
dict.Add((value, id), (value, view)); dict.Add((value, id), (value, view));
filter.InvokeOnAdd(value, view); filter.InvokeOnAdd(value, view, e);
} }
else else
{ {
@ -131,7 +131,7 @@ namespace ObservableCollections.Internal
var view = transform(value); var view = transform(value);
var id = identitySelector(value); var id = identitySelector(value);
dict.Add((value, id), (value, view)); dict.Add((value, id), (value, view));
filter.InvokeOnAdd(value, view); filter.InvokeOnAdd(value, view, e);
} }
} }
} }
@ -143,7 +143,7 @@ namespace ObservableCollections.Internal
var value = e.OldItem; var value = e.OldItem;
var id = identitySelector(value); var id = identitySelector(value);
dict.Remove((value, id), out var v); dict.Remove((value, id), out var v);
filter.InvokeOnRemove(v.Value, v.View); filter.InvokeOnRemove(v.Value, v.View, e);
} }
else else
{ {
@ -151,7 +151,7 @@ namespace ObservableCollections.Internal
{ {
var id = identitySelector(value); var id = identitySelector(value);
dict.Remove((value, id), out var v); dict.Remove((value, id), out var v);
filter.InvokeOnRemove(v.Value, v.View); filter.InvokeOnRemove(v.Value, v.View, e);
} }
} }
} }
@ -168,8 +168,8 @@ namespace ObservableCollections.Internal
var id = identitySelector(value); var id = identitySelector(value);
dict.Add((value, id), (value, view)); dict.Add((value, id), (value, view));
filter.InvokeOnRemove(oldView); filter.InvokeOnRemove(oldView, e);
filter.InvokeOnAdd(value, view); filter.InvokeOnAdd(value, view, e);
} }
break; break;
case NotifyCollectionChangedAction.Move: case NotifyCollectionChangedAction.Move:
@ -178,7 +178,7 @@ namespace ObservableCollections.Internal
var oldValue = e.OldItem; var oldValue = e.OldItem;
if (dict.TryGetValue((oldValue, identitySelector(oldValue)), out var view)) if (dict.TryGetValue((oldValue, identitySelector(oldValue)), out var view))
{ {
filter.InvokeOnMove(view); filter.InvokeOnMove(view, e);
} }
} }
break; break;
@ -187,7 +187,7 @@ namespace ObservableCollections.Internal
{ {
foreach (var item in dict) foreach (var item in dict)
{ {
filter.InvokeOnRemove(item.Value); filter.InvokeOnRemove(item.Value, e);
} }
} }
dict.Clear(); dict.Clear();

View File

@ -128,7 +128,7 @@ namespace ObservableCollections.Internal
var id = identitySelector(value); var id = identitySelector(value);
dict.Add((view, id), (value, view)); dict.Add((view, id), (value, view));
viewMap.Add(id, view); viewMap.Add(id, view);
filter.InvokeOnAdd(value, view); filter.InvokeOnAdd(value, view, e);
} }
else else
{ {
@ -138,7 +138,7 @@ namespace ObservableCollections.Internal
var id = identitySelector(value); var id = identitySelector(value);
dict.Add((view, id), (value, view)); dict.Add((view, id), (value, view));
viewMap.Add(id, view); viewMap.Add(id, view);
filter.InvokeOnAdd(value, view); filter.InvokeOnAdd(value, view, e);
} }
} }
} }
@ -152,7 +152,7 @@ namespace ObservableCollections.Internal
if (viewMap.Remove(id, out var view)) if (viewMap.Remove(id, out var view))
{ {
dict.Remove((view, id), out var v); dict.Remove((view, id), out var v);
filter.InvokeOnRemove(v); filter.InvokeOnRemove(v, e);
} }
} }
else else
@ -163,7 +163,7 @@ namespace ObservableCollections.Internal
if (viewMap.Remove(id, out var view)) if (viewMap.Remove(id, out var view))
{ {
dict.Remove((view, id), out var v); dict.Remove((view, id), out var v);
filter.InvokeOnRemove(v); filter.InvokeOnRemove(v, e);
} }
} }
} }
@ -177,7 +177,7 @@ namespace ObservableCollections.Internal
if (viewMap.Remove(oldKey, out var oldView)) if (viewMap.Remove(oldKey, out var oldView))
{ {
dict.Remove((oldView, oldKey)); dict.Remove((oldView, oldKey));
filter.InvokeOnRemove(oldValue, oldView); filter.InvokeOnRemove(oldValue, oldView, e);
} }
var value = e.NewItem; var value = e.NewItem;
@ -186,7 +186,7 @@ namespace ObservableCollections.Internal
dict.Add((view, id), (value, view)); dict.Add((view, id), (value, view));
viewMap.Add(id, view); viewMap.Add(id, view);
filter.InvokeOnAdd(value, view); filter.InvokeOnAdd(value, view, e);
} }
break; break;
case NotifyCollectionChangedAction.Move: case NotifyCollectionChangedAction.Move:
@ -196,7 +196,7 @@ namespace ObservableCollections.Internal
var key = identitySelector(value); var key = identitySelector(value);
if (viewMap.TryGetValue(key, out var view)) if (viewMap.TryGetValue(key, out var view))
{ {
filter.InvokeOnMove(value, view); filter.InvokeOnMove(value, view, e);
} }
} }
break; break;
@ -205,7 +205,7 @@ namespace ObservableCollections.Internal
{ {
foreach (var item in dict) foreach (var item in dict)
{ {
filter.InvokeOnRemove(item.Value); filter.InvokeOnRemove(item.Value, e);
} }
} }
dict.Clear(); dict.Clear();

View File

@ -121,14 +121,14 @@ namespace ObservableCollections
{ {
var v = selector(e.NewItem); var v = selector(e.NewItem);
dict.Add(e.NewItem.Key, (e.NewItem.Value, v)); dict.Add(e.NewItem.Key, (e.NewItem.Value, v));
filter.InvokeOnAdd(new KeyValuePair<TKey, TValue>(e.NewItem.Key, e.NewItem.Value), v); filter.InvokeOnAdd(new KeyValuePair<TKey, TValue>(e.NewItem.Key, e.NewItem.Value), v, e);
} }
break; break;
case NotifyCollectionChangedAction.Remove: case NotifyCollectionChangedAction.Remove:
{ {
if (dict.Remove(e.OldItem.Key, out var v)) if (dict.Remove(e.OldItem.Key, out var v))
{ {
filter.InvokeOnRemove((new KeyValuePair<TKey, TValue>(e.OldItem.Key, v.Item1), v.Item2)); filter.InvokeOnRemove((new KeyValuePair<TKey, TValue>(e.OldItem.Key, v.Item1), v.Item2), e);
} }
} }
break; break;
@ -136,12 +136,12 @@ namespace ObservableCollections
{ {
if (dict.Remove(e.OldItem.Key, out var oldView)) if (dict.Remove(e.OldItem.Key, out var oldView))
{ {
filter.InvokeOnRemove((new KeyValuePair<TKey, TValue>(e.OldItem.Key, oldView.Item1), oldView.Item2)); filter.InvokeOnRemove((new KeyValuePair<TKey, TValue>(e.OldItem.Key, oldView.Item1), oldView.Item2), e);
} }
var v = selector(e.NewItem); var v = selector(e.NewItem);
dict[e.NewItem.Key] = (e.NewItem.Value, v); dict[e.NewItem.Key] = (e.NewItem.Value, v);
filter.InvokeOnAdd(new KeyValuePair<TKey, TValue>(e.NewItem.Key, e.NewItem.Value), v); filter.InvokeOnAdd(new KeyValuePair<TKey, TValue>(e.NewItem.Key, e.NewItem.Value), v, e);
} }
break; break;
case NotifyCollectionChangedAction.Reset: case NotifyCollectionChangedAction.Reset:
@ -150,7 +150,7 @@ namespace ObservableCollections
{ {
foreach (var item in dict) foreach (var item in dict)
{ {
filter.InvokeOnRemove((new KeyValuePair<TKey, TValue>(item.Key, item.Value.Item1), item.Value.Item2)); filter.InvokeOnRemove((new KeyValuePair<TKey, TValue>(item.Key, item.Value.Item1), item.Value.Item2), e);
} }
} }

View File

@ -118,7 +118,7 @@ namespace ObservableCollections
{ {
var v = (e.NewItem, selector(e.NewItem)); var v = (e.NewItem, selector(e.NewItem));
dict.Add(e.NewItem, v); dict.Add(e.NewItem, v);
filter.InvokeOnAdd(v); filter.InvokeOnAdd(v, e);
} }
else else
{ {
@ -126,7 +126,7 @@ namespace ObservableCollections
{ {
var v = (item, selector(item)); var v = (item, selector(item));
dict.Add(item, v); dict.Add(item, v);
filter.InvokeOnAdd(v); filter.InvokeOnAdd(v, e);
} }
} }
break; break;
@ -135,7 +135,7 @@ namespace ObservableCollections
{ {
if (dict.Remove(e.OldItem, out var value)) if (dict.Remove(e.OldItem, out var value))
{ {
filter.InvokeOnRemove(value.Item1, value.Item2); filter.InvokeOnRemove(value.Item1, value.Item2, e);
} }
} }
else else
@ -144,7 +144,7 @@ namespace ObservableCollections
{ {
if (dict.Remove(item, out var value)) if (dict.Remove(item, out var value))
{ {
filter.InvokeOnRemove(value.Item1, value.Item2); filter.InvokeOnRemove(value.Item1, value.Item2, e);
} }
} }
} }
@ -154,7 +154,7 @@ namespace ObservableCollections
{ {
foreach (var item in dict) foreach (var item in dict)
{ {
filter.InvokeOnRemove(item.Value); filter.InvokeOnRemove(item.Value, e);
} }
} }
dict.Clear(); dict.Clear();

View File

@ -3,6 +3,7 @@ using System;
using System.Collections; using System.Collections;
using System.Collections.Generic; using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis; using System.Diagnostics.CodeAnalysis;
using System.Linq;
namespace ObservableCollections namespace ObservableCollections
{ {

View File

@ -136,7 +136,7 @@ namespace ObservableCollections
{ {
var v = (e.NewItem, selector(e.NewItem)); var v = (e.NewItem, selector(e.NewItem));
list.Add(v); list.Add(v);
filter.InvokeOnAdd(v); filter.InvokeOnAdd(v, e);
} }
else else
{ {
@ -144,7 +144,7 @@ namespace ObservableCollections
{ {
var v = (item, selector(item)); var v = (item, selector(item));
list.Add(v); list.Add(v);
filter.InvokeOnAdd(v); filter.InvokeOnAdd(v, e);
} }
} }
} }
@ -155,7 +155,7 @@ namespace ObservableCollections
{ {
var v = (e.NewItem, selector(e.NewItem)); var v = (e.NewItem, selector(e.NewItem));
list.Insert(e.NewStartingIndex, v); list.Insert(e.NewStartingIndex, v);
filter.InvokeOnAdd(v); filter.InvokeOnAdd(v, e);
} }
else else
{ {
@ -166,7 +166,7 @@ namespace ObservableCollections
{ {
var v = (span[i], selector(span[i])); var v = (span[i], selector(span[i]));
newArray[i] = v; newArray[i] = v;
filter.InvokeOnAdd(v); filter.InvokeOnAdd(v, e);
} }
list.InsertRange(e.NewStartingIndex, newArray); list.InsertRange(e.NewStartingIndex, newArray);
} }
@ -177,7 +177,7 @@ namespace ObservableCollections
{ {
var v = list[e.OldStartingIndex]; var v = list[e.OldStartingIndex];
list.RemoveAt(e.OldStartingIndex); list.RemoveAt(e.OldStartingIndex);
filter.InvokeOnRemove(v.Item1, v.Item2); filter.InvokeOnRemove(v.Item1, v.Item2, e);
} }
else else
{ {
@ -185,7 +185,7 @@ namespace ObservableCollections
for (int i = e.OldStartingIndex; i < len; i++) for (int i = e.OldStartingIndex; i < len; i++)
{ {
var v = list[i]; var v = list[i];
filter.InvokeOnRemove(v.Item1, v.Item2); filter.InvokeOnRemove(v.Item1, v.Item2, e);
} }
list.RemoveRange(e.OldStartingIndex, e.OldItems.Length); list.RemoveRange(e.OldStartingIndex, e.OldItems.Length);
@ -199,8 +199,8 @@ namespace ObservableCollections
var oldItem = list[e.NewStartingIndex]; var oldItem = list[e.NewStartingIndex];
list[e.NewStartingIndex] = v; list[e.NewStartingIndex] = v;
filter.InvokeOnRemove(oldItem); filter.InvokeOnRemove(oldItem, e);
filter.InvokeOnAdd(v); filter.InvokeOnAdd(v, e);
break; break;
} }
case NotifyCollectionChangedAction.Move: case NotifyCollectionChangedAction.Move:
@ -209,7 +209,7 @@ namespace ObservableCollections
list.RemoveAt(e.OldStartingIndex); list.RemoveAt(e.OldStartingIndex);
list.Insert(e.NewStartingIndex, removeItem); list.Insert(e.NewStartingIndex, removeItem);
filter.InvokeOnMove(removeItem); filter.InvokeOnMove(removeItem, e);
} }
break; break;
case NotifyCollectionChangedAction.Reset: case NotifyCollectionChangedAction.Reset:
@ -217,7 +217,7 @@ namespace ObservableCollections
{ {
foreach (var item in list) foreach (var item in list)
{ {
filter.InvokeOnRemove(item); filter.InvokeOnRemove(item, e);
} }
} }
list.Clear(); list.Clear();

View File

@ -134,7 +134,7 @@ namespace ObservableCollections
{ {
var v = (e.NewItem, selector(e.NewItem)); var v = (e.NewItem, selector(e.NewItem));
queue.Enqueue(v); queue.Enqueue(v);
filter.InvokeOnAdd(v); filter.InvokeOnAdd(v, e);
} }
else else
{ {
@ -142,7 +142,7 @@ namespace ObservableCollections
{ {
var v = (item, selector(item)); var v = (item, selector(item));
queue.Enqueue(v); queue.Enqueue(v);
filter.InvokeOnAdd(v); filter.InvokeOnAdd(v, e);
} }
} }
break; break;
@ -151,7 +151,7 @@ namespace ObservableCollections
if (e.IsSingleItem) if (e.IsSingleItem)
{ {
var v = queue.Dequeue(); var v = queue.Dequeue();
filter.InvokeOnRemove(v.Item1, v.Item2); filter.InvokeOnRemove(v.Item1, v.Item2, e);
} }
else else
{ {
@ -159,7 +159,7 @@ namespace ObservableCollections
for (int i = 0; i < len; i++) for (int i = 0; i < len; i++)
{ {
var v = queue.Dequeue(); var v = queue.Dequeue();
filter.InvokeOnRemove(v.Item1, v.Item2); filter.InvokeOnRemove(v.Item1, v.Item2, e);
} }
} }
break; break;
@ -168,7 +168,7 @@ namespace ObservableCollections
{ {
foreach (var item in queue) foreach (var item in queue)
{ {
filter.InvokeOnRemove(item); filter.InvokeOnRemove(item, e);
} }
} }
queue.Clear(); queue.Clear();

View File

@ -141,7 +141,7 @@ namespace ObservableCollections
{ {
var v = (e.NewItem, selector(e.NewItem)); var v = (e.NewItem, selector(e.NewItem));
ringBuffer.AddFirst(v); ringBuffer.AddFirst(v);
filter.InvokeOnAdd(v); filter.InvokeOnAdd(v, e);
} }
else else
{ {
@ -149,7 +149,7 @@ namespace ObservableCollections
{ {
var v = (item, selector(item)); var v = (item, selector(item));
ringBuffer.AddFirst(v); ringBuffer.AddFirst(v);
filter.InvokeOnAdd(v); filter.InvokeOnAdd(v, e);
} }
} }
} }
@ -160,7 +160,7 @@ namespace ObservableCollections
{ {
var v = (e.NewItem, selector(e.NewItem)); var v = (e.NewItem, selector(e.NewItem));
ringBuffer.AddLast(v); ringBuffer.AddLast(v);
filter.InvokeOnAdd(v); filter.InvokeOnAdd(v, e);
} }
else else
{ {
@ -168,7 +168,7 @@ namespace ObservableCollections
{ {
var v = (item, selector(item)); var v = (item, selector(item));
ringBuffer.AddLast(v); ringBuffer.AddLast(v);
filter.InvokeOnAdd(v); filter.InvokeOnAdd(v, e);
} }
} }
} }
@ -181,14 +181,14 @@ namespace ObservableCollections
if (e.IsSingleItem) if (e.IsSingleItem)
{ {
var v = ringBuffer.RemoveFirst(); var v = ringBuffer.RemoveFirst();
filter.InvokeOnRemove(v); filter.InvokeOnRemove(v, e);
} }
else else
{ {
for (int i = 0; i < e.OldItems.Length; i++) for (int i = 0; i < e.OldItems.Length; i++)
{ {
var v = ringBuffer.RemoveFirst(); var v = ringBuffer.RemoveFirst();
filter.InvokeOnRemove(v); filter.InvokeOnRemove(v, e);
} }
} }
} }
@ -198,14 +198,14 @@ namespace ObservableCollections
if (e.IsSingleItem) if (e.IsSingleItem)
{ {
var v = ringBuffer.RemoveLast(); var v = ringBuffer.RemoveLast();
filter.InvokeOnRemove(v); filter.InvokeOnRemove(v, e);
} }
else else
{ {
for (int i = 0; i < e.OldItems.Length; i++) for (int i = 0; i < e.OldItems.Length; i++)
{ {
var v = ringBuffer.RemoveLast(); var v = ringBuffer.RemoveLast();
filter.InvokeOnRemove(v); filter.InvokeOnRemove(v, e);
} }
} }
} }
@ -215,7 +215,7 @@ namespace ObservableCollections
{ {
foreach (var item in ringBuffer) foreach (var item in ringBuffer)
{ {
filter.InvokeOnRemove(item); filter.InvokeOnRemove(item, e);
} }
} }
ringBuffer.Clear(); ringBuffer.Clear();
@ -228,8 +228,8 @@ namespace ObservableCollections
var oldItem = ringBuffer[e.NewStartingIndex]; var oldItem = ringBuffer[e.NewStartingIndex];
ringBuffer[e.NewStartingIndex] = v; ringBuffer[e.NewStartingIndex] = v;
filter.InvokeOnRemove(oldItem); filter.InvokeOnRemove(oldItem, e);
filter.InvokeOnAdd(v); filter.InvokeOnAdd(v, e);
break; break;
} }
case NotifyCollectionChangedAction.Move: case NotifyCollectionChangedAction.Move:

View File

@ -134,7 +134,7 @@ namespace ObservableCollections
{ {
var v = (e.NewItem, selector(e.NewItem)); var v = (e.NewItem, selector(e.NewItem));
stack.Push(v); stack.Push(v);
filter.InvokeOnAdd(v); filter.InvokeOnAdd(v, e);
} }
else else
{ {
@ -142,7 +142,7 @@ namespace ObservableCollections
{ {
var v = (item, selector(item)); var v = (item, selector(item));
stack.Push(v); stack.Push(v);
filter.InvokeOnAdd(v); filter.InvokeOnAdd(v, e);
} }
} }
break; break;
@ -151,7 +151,7 @@ namespace ObservableCollections
if (e.IsSingleItem) if (e.IsSingleItem)
{ {
var v = stack.Pop(); var v = stack.Pop();
filter.InvokeOnRemove(v.Item1, v.Item2); filter.InvokeOnRemove(v.Item1, v.Item2, e);
} }
else else
{ {
@ -159,7 +159,7 @@ namespace ObservableCollections
for (int i = 0; i < len; i++) for (int i = 0; i < len; i++)
{ {
var v = stack.Pop(); var v = stack.Pop();
filter.InvokeOnRemove(v.Item1, v.Item2); filter.InvokeOnRemove(v.Item1, v.Item2, e);
} }
} }
break; break;
@ -168,7 +168,7 @@ namespace ObservableCollections
{ {
foreach (var item in stack) foreach (var item in stack)
{ {
filter.InvokeOnRemove(item); filter.InvokeOnRemove(item, e);
} }
} }
stack.Clear(); stack.Clear();

View File

@ -2,6 +2,7 @@ using System;
using System.Collections; using System.Collections;
using System.Collections.Generic; using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis; using System.Diagnostics.CodeAnalysis;
using System.Linq;
namespace ObservableCollections namespace ObservableCollections
{ {

View File

@ -7,7 +7,7 @@ namespace ObservableCollections
bool IsMatch(T value, TView view); bool IsMatch(T value, TView view);
void WhenTrue(T value, TView view); void WhenTrue(T value, TView view);
void WhenFalse(T value, TView view); void WhenFalse(T value, TView view);
void OnCollectionChanged(ChangedKind changedKind, T value, TView view); void OnCollectionChanged(ChangedKind changedKind, T value, TView view, in NotifyCollectionChangedEventArgs<T> eventArgs);
} }
public enum ChangedKind public enum ChangedKind
@ -35,14 +35,14 @@ namespace ObservableCollections
public bool IsMatch(T value, TView view) => isMatch(value, view); public bool IsMatch(T value, TView view) => isMatch(value, view);
public void WhenFalse(T value, TView view) => whenFalse?.Invoke(value, view); public void WhenFalse(T value, TView view) => whenFalse?.Invoke(value, view);
public void WhenTrue(T value, TView view) => whenTrue?.Invoke(value, view); public void WhenTrue(T value, TView view) => whenTrue?.Invoke(value, view);
public void OnCollectionChanged(ChangedKind changedKind, T value, TView view) => onCollectionChanged?.Invoke(changedKind, value, view); public void OnCollectionChanged(ChangedKind changedKind, T value, TView view, in NotifyCollectionChangedEventArgs<T> eventArgs) => onCollectionChanged?.Invoke(changedKind, value, view);
class NullViewFilter : ISynchronizedViewFilter<T, TView> class NullViewFilter : ISynchronizedViewFilter<T, TView>
{ {
public bool IsMatch(T value, TView view) => true; public bool IsMatch(T value, TView view) => true;
public void WhenFalse(T value, TView view) { } public void WhenFalse(T value, TView view) { }
public void WhenTrue(T value, TView view) { } public void WhenTrue(T value, TView view) { }
public void OnCollectionChanged(ChangedKind changedKind, T value, TView view) { } public void OnCollectionChanged(ChangedKind changedKind, T value, TView view, in NotifyCollectionChangedEventArgs<T> eventArgs) { }
} }
} }
@ -68,12 +68,12 @@ namespace ObservableCollections
return filter == SynchronizedViewFilter<T, TView>.Null; return filter == SynchronizedViewFilter<T, TView>.Null;
} }
internal static void InvokeOnAdd<T, TView>(this ISynchronizedViewFilter<T, TView> filter, (T value, TView view) value) internal static void InvokeOnAdd<T, TView>(this ISynchronizedViewFilter<T, TView> filter, (T value, TView view) value, in NotifyCollectionChangedEventArgs<T> eventArgs)
{ {
InvokeOnAdd(filter, value.value, value.view); InvokeOnAdd(filter, value.value, value.view, eventArgs);
} }
internal static void InvokeOnAdd<T, TView>(this ISynchronizedViewFilter<T, TView> filter, T value, TView view) internal static void InvokeOnAdd<T, TView>(this ISynchronizedViewFilter<T, TView> filter, T value, TView view, in NotifyCollectionChangedEventArgs<T> eventArgs)
{ {
if (filter.IsMatch(value, view)) if (filter.IsMatch(value, view))
{ {
@ -83,27 +83,27 @@ namespace ObservableCollections
{ {
filter.WhenFalse(value, view); filter.WhenFalse(value, view);
} }
filter.OnCollectionChanged(ChangedKind.Add, value, view); filter.OnCollectionChanged(ChangedKind.Add, value, view, eventArgs);
} }
internal static void InvokeOnRemove<T, TView>(this ISynchronizedViewFilter<T, TView> filter, (T value, TView view) value) internal static void InvokeOnRemove<T, TView>(this ISynchronizedViewFilter<T, TView> filter, (T value, TView view) value, in NotifyCollectionChangedEventArgs<T> eventArgs)
{ {
InvokeOnRemove(filter, value.value, value.view); InvokeOnRemove(filter, value.value, value.view, eventArgs);
} }
internal static void InvokeOnRemove<T, TView>(this ISynchronizedViewFilter<T, TView> filter, T value, TView view) internal static void InvokeOnRemove<T, TView>(this ISynchronizedViewFilter<T, TView> filter, T value, TView view, in NotifyCollectionChangedEventArgs<T> eventArgs)
{ {
filter.OnCollectionChanged(ChangedKind.Remove, value, view); filter.OnCollectionChanged(ChangedKind.Remove, value, view, eventArgs);
} }
internal static void InvokeOnMove<T, TView>(this ISynchronizedViewFilter<T, TView> filter, (T value, TView view) value) internal static void InvokeOnMove<T, TView>(this ISynchronizedViewFilter<T, TView> filter, (T value, TView view) value, in NotifyCollectionChangedEventArgs<T> eventArgs)
{ {
InvokeOnMove(filter, value.value, value.view); InvokeOnMove(filter, value.value, value.view, eventArgs);
} }
internal static void InvokeOnMove<T, TView>(this ISynchronizedViewFilter<T, TView> filter, T value, TView view) internal static void InvokeOnMove<T, TView>(this ISynchronizedViewFilter<T, TView> filter, T value, TView view, in NotifyCollectionChangedEventArgs<T> eventArgs)
{ {
filter.OnCollectionChanged(ChangedKind.Move, value, view); filter.OnCollectionChanged(ChangedKind.Move, value, view, eventArgs);
} }
internal static void InvokeOnAttach<T, TView>(this ISynchronizedViewFilter<T, TView> filter, T value, TView view) internal static void InvokeOnAttach<T, TView>(this ISynchronizedViewFilter<T, TView> filter, T value, TView view)

View File

@ -3,6 +3,7 @@ using System.Buffers;
using System.Collections; using System.Collections;
using System.Collections.Generic; using System.Collections.Generic;
using System.Runtime.CompilerServices; using System.Runtime.CompilerServices;
using System.Linq;
namespace ObservableCollections.Internal namespace ObservableCollections.Internal
{ {

View File

@ -122,7 +122,7 @@ namespace ObservableCollections.Internal
var view = transform(value); var view = transform(value);
var id = identitySelector(value); var id = identitySelector(value);
dict.Add((value, id), (value, view)); dict.Add((value, id), (value, view));
filter.InvokeOnAdd(value, view); filter.InvokeOnAdd(value, view, e);
} }
else else
{ {
@ -131,7 +131,7 @@ namespace ObservableCollections.Internal
var view = transform(value); var view = transform(value);
var id = identitySelector(value); var id = identitySelector(value);
dict.Add((value, id), (value, view)); dict.Add((value, id), (value, view));
filter.InvokeOnAdd(value, view); filter.InvokeOnAdd(value, view, e);
} }
} }
} }
@ -143,7 +143,7 @@ namespace ObservableCollections.Internal
var value = e.OldItem; var value = e.OldItem;
var id = identitySelector(value); var id = identitySelector(value);
dict.Remove((value, id), out var v); dict.Remove((value, id), out var v);
filter.InvokeOnRemove(v.Value, v.View); filter.InvokeOnRemove(v.Value, v.View, e);
} }
else else
{ {
@ -151,7 +151,7 @@ namespace ObservableCollections.Internal
{ {
var id = identitySelector(value); var id = identitySelector(value);
dict.Remove((value, id), out var v); dict.Remove((value, id), out var v);
filter.InvokeOnRemove(v.Value, v.View); filter.InvokeOnRemove(v.Value, v.View, e);
} }
} }
} }
@ -168,8 +168,8 @@ namespace ObservableCollections.Internal
var id = identitySelector(value); var id = identitySelector(value);
dict.Add((value, id), (value, view)); dict.Add((value, id), (value, view));
filter.InvokeOnRemove(oldView); filter.InvokeOnRemove(oldView, e);
filter.InvokeOnAdd(value, view); filter.InvokeOnAdd(value, view, e);
} }
break; break;
case NotifyCollectionChangedAction.Move: case NotifyCollectionChangedAction.Move:
@ -178,7 +178,7 @@ namespace ObservableCollections.Internal
var oldValue = e.OldItem; var oldValue = e.OldItem;
if (dict.TryGetValue((oldValue, identitySelector(oldValue)), out var view)) if (dict.TryGetValue((oldValue, identitySelector(oldValue)), out var view))
{ {
filter.InvokeOnMove(view); filter.InvokeOnMove(view, e);
} }
} }
break; break;
@ -187,7 +187,7 @@ namespace ObservableCollections.Internal
{ {
foreach (var item in dict) foreach (var item in dict)
{ {
filter.InvokeOnRemove(item.Value); filter.InvokeOnRemove(item.Value, e);
} }
} }
dict.Clear(); dict.Clear();

View File

@ -128,7 +128,7 @@ namespace ObservableCollections.Internal
var id = identitySelector(value); var id = identitySelector(value);
dict.Add((view, id), (value, view)); dict.Add((view, id), (value, view));
viewMap.Add(id, view); viewMap.Add(id, view);
filter.InvokeOnAdd(value, view); filter.InvokeOnAdd(value, view, e);
} }
else else
{ {
@ -138,7 +138,7 @@ namespace ObservableCollections.Internal
var id = identitySelector(value); var id = identitySelector(value);
dict.Add((view, id), (value, view)); dict.Add((view, id), (value, view));
viewMap.Add(id, view); viewMap.Add(id, view);
filter.InvokeOnAdd(value, view); filter.InvokeOnAdd(value, view, e);
} }
} }
} }
@ -152,7 +152,7 @@ namespace ObservableCollections.Internal
if (viewMap.Remove(id, out var view)) if (viewMap.Remove(id, out var view))
{ {
dict.Remove((view, id), out var v); dict.Remove((view, id), out var v);
filter.InvokeOnRemove(v); filter.InvokeOnRemove(v, e);
} }
} }
else else
@ -163,7 +163,7 @@ namespace ObservableCollections.Internal
if (viewMap.Remove(id, out var view)) if (viewMap.Remove(id, out var view))
{ {
dict.Remove((view, id), out var v); dict.Remove((view, id), out var v);
filter.InvokeOnRemove(v); filter.InvokeOnRemove(v, e);
} }
} }
} }
@ -177,7 +177,7 @@ namespace ObservableCollections.Internal
if (viewMap.Remove(oldKey, out var oldView)) if (viewMap.Remove(oldKey, out var oldView))
{ {
dict.Remove((oldView, oldKey)); dict.Remove((oldView, oldKey));
filter.InvokeOnRemove(oldValue, oldView); filter.InvokeOnRemove(oldValue, oldView, e);
} }
var value = e.NewItem; var value = e.NewItem;
@ -186,7 +186,7 @@ namespace ObservableCollections.Internal
dict.Add((view, id), (value, view)); dict.Add((view, id), (value, view));
viewMap.Add(id, view); viewMap.Add(id, view);
filter.InvokeOnAdd(value, view); filter.InvokeOnAdd(value, view, e);
} }
break; break;
case NotifyCollectionChangedAction.Move: case NotifyCollectionChangedAction.Move:
@ -196,7 +196,7 @@ namespace ObservableCollections.Internal
var key = identitySelector(value); var key = identitySelector(value);
if (viewMap.TryGetValue(key, out var view)) if (viewMap.TryGetValue(key, out var view))
{ {
filter.InvokeOnMove(value, view); filter.InvokeOnMove(value, view, e);
} }
} }
break; break;
@ -205,7 +205,7 @@ namespace ObservableCollections.Internal
{ {
foreach (var item in dict) foreach (var item in dict)
{ {
filter.InvokeOnRemove(item.Value); filter.InvokeOnRemove(item.Value, e);
} }
} }
dict.Clear(); dict.Clear();

View File

@ -121,14 +121,14 @@ namespace ObservableCollections
{ {
var v = selector(e.NewItem); var v = selector(e.NewItem);
dict.Add(e.NewItem.Key, (e.NewItem.Value, v)); dict.Add(e.NewItem.Key, (e.NewItem.Value, v));
filter.InvokeOnAdd(new KeyValuePair<TKey, TValue>(e.NewItem.Key, e.NewItem.Value), v); filter.InvokeOnAdd(new KeyValuePair<TKey, TValue>(e.NewItem.Key, e.NewItem.Value), v, e);
} }
break; break;
case NotifyCollectionChangedAction.Remove: case NotifyCollectionChangedAction.Remove:
{ {
if (dict.Remove(e.OldItem.Key, out var v)) if (dict.Remove(e.OldItem.Key, out var v))
{ {
filter.InvokeOnRemove((new KeyValuePair<TKey, TValue>(e.OldItem.Key, v.Item1), v.Item2)); filter.InvokeOnRemove((new KeyValuePair<TKey, TValue>(e.OldItem.Key, v.Item1), v.Item2), e);
} }
} }
break; break;
@ -136,12 +136,12 @@ namespace ObservableCollections
{ {
if (dict.Remove(e.OldItem.Key, out var oldView)) if (dict.Remove(e.OldItem.Key, out var oldView))
{ {
filter.InvokeOnRemove((new KeyValuePair<TKey, TValue>(e.OldItem.Key, oldView.Item1), oldView.Item2)); filter.InvokeOnRemove((new KeyValuePair<TKey, TValue>(e.OldItem.Key, oldView.Item1), oldView.Item2), e);
} }
var v = selector(e.NewItem); var v = selector(e.NewItem);
dict[e.NewItem.Key] = (e.NewItem.Value, v); dict[e.NewItem.Key] = (e.NewItem.Value, v);
filter.InvokeOnAdd(new KeyValuePair<TKey, TValue>(e.NewItem.Key, e.NewItem.Value), v); filter.InvokeOnAdd(new KeyValuePair<TKey, TValue>(e.NewItem.Key, e.NewItem.Value), v, e);
} }
break; break;
case NotifyCollectionChangedAction.Reset: case NotifyCollectionChangedAction.Reset:
@ -150,7 +150,7 @@ namespace ObservableCollections
{ {
foreach (var item in dict) foreach (var item in dict)
{ {
filter.InvokeOnRemove((new KeyValuePair<TKey, TValue>(item.Key, item.Value.Item1), item.Value.Item2)); filter.InvokeOnRemove((new KeyValuePair<TKey, TValue>(item.Key, item.Value.Item1), item.Value.Item2), e);
} }
} }

View File

@ -118,7 +118,7 @@ namespace ObservableCollections
{ {
var v = (e.NewItem, selector(e.NewItem)); var v = (e.NewItem, selector(e.NewItem));
dict.Add(e.NewItem, v); dict.Add(e.NewItem, v);
filter.InvokeOnAdd(v); filter.InvokeOnAdd(v, e);
} }
else else
{ {
@ -126,7 +126,7 @@ namespace ObservableCollections
{ {
var v = (item, selector(item)); var v = (item, selector(item));
dict.Add(item, v); dict.Add(item, v);
filter.InvokeOnAdd(v); filter.InvokeOnAdd(v, e);
} }
} }
break; break;
@ -135,7 +135,7 @@ namespace ObservableCollections
{ {
if (dict.Remove(e.OldItem, out var value)) if (dict.Remove(e.OldItem, out var value))
{ {
filter.InvokeOnRemove(value.Item1, value.Item2); filter.InvokeOnRemove(value.Item1, value.Item2, e);
} }
} }
else else
@ -144,7 +144,7 @@ namespace ObservableCollections
{ {
if (dict.Remove(item, out var value)) if (dict.Remove(item, out var value))
{ {
filter.InvokeOnRemove(value.Item1, value.Item2); filter.InvokeOnRemove(value.Item1, value.Item2, e);
} }
} }
} }
@ -154,7 +154,7 @@ namespace ObservableCollections
{ {
foreach (var item in dict) foreach (var item in dict)
{ {
filter.InvokeOnRemove(item.Value); filter.InvokeOnRemove(item.Value, e);
} }
} }
dict.Clear(); dict.Clear();

View File

@ -3,6 +3,7 @@ using System;
using System.Collections; using System.Collections;
using System.Collections.Generic; using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis; using System.Diagnostics.CodeAnalysis;
using System.Linq;
namespace ObservableCollections namespace ObservableCollections
{ {

View File

@ -136,7 +136,7 @@ namespace ObservableCollections
{ {
var v = (e.NewItem, selector(e.NewItem)); var v = (e.NewItem, selector(e.NewItem));
list.Add(v); list.Add(v);
filter.InvokeOnAdd(v); filter.InvokeOnAdd(v, e);
} }
else else
{ {
@ -144,7 +144,7 @@ namespace ObservableCollections
{ {
var v = (item, selector(item)); var v = (item, selector(item));
list.Add(v); list.Add(v);
filter.InvokeOnAdd(v); filter.InvokeOnAdd(v, e);
} }
} }
} }
@ -155,7 +155,7 @@ namespace ObservableCollections
{ {
var v = (e.NewItem, selector(e.NewItem)); var v = (e.NewItem, selector(e.NewItem));
list.Insert(e.NewStartingIndex, v); list.Insert(e.NewStartingIndex, v);
filter.InvokeOnAdd(v); filter.InvokeOnAdd(v, e);
} }
else else
{ {
@ -166,7 +166,7 @@ namespace ObservableCollections
{ {
var v = (span[i], selector(span[i])); var v = (span[i], selector(span[i]));
newArray[i] = v; newArray[i] = v;
filter.InvokeOnAdd(v); filter.InvokeOnAdd(v, e);
} }
list.InsertRange(e.NewStartingIndex, newArray); list.InsertRange(e.NewStartingIndex, newArray);
} }
@ -177,7 +177,7 @@ namespace ObservableCollections
{ {
var v = list[e.OldStartingIndex]; var v = list[e.OldStartingIndex];
list.RemoveAt(e.OldStartingIndex); list.RemoveAt(e.OldStartingIndex);
filter.InvokeOnRemove(v.Item1, v.Item2); filter.InvokeOnRemove(v.Item1, v.Item2, e);
} }
else else
{ {
@ -185,7 +185,7 @@ namespace ObservableCollections
for (int i = e.OldStartingIndex; i < len; i++) for (int i = e.OldStartingIndex; i < len; i++)
{ {
var v = list[i]; var v = list[i];
filter.InvokeOnRemove(v.Item1, v.Item2); filter.InvokeOnRemove(v.Item1, v.Item2, e);
} }
list.RemoveRange(e.OldStartingIndex, e.OldItems.Length); list.RemoveRange(e.OldStartingIndex, e.OldItems.Length);
@ -199,8 +199,8 @@ namespace ObservableCollections
var oldItem = list[e.NewStartingIndex]; var oldItem = list[e.NewStartingIndex];
list[e.NewStartingIndex] = v; list[e.NewStartingIndex] = v;
filter.InvokeOnRemove(oldItem); filter.InvokeOnRemove(oldItem, e);
filter.InvokeOnAdd(v); filter.InvokeOnAdd(v, e);
break; break;
} }
case NotifyCollectionChangedAction.Move: case NotifyCollectionChangedAction.Move:
@ -209,7 +209,7 @@ namespace ObservableCollections
list.RemoveAt(e.OldStartingIndex); list.RemoveAt(e.OldStartingIndex);
list.Insert(e.NewStartingIndex, removeItem); list.Insert(e.NewStartingIndex, removeItem);
filter.InvokeOnMove(removeItem); filter.InvokeOnMove(removeItem, e);
} }
break; break;
case NotifyCollectionChangedAction.Reset: case NotifyCollectionChangedAction.Reset:
@ -217,7 +217,7 @@ namespace ObservableCollections
{ {
foreach (var item in list) foreach (var item in list)
{ {
filter.InvokeOnRemove(item); filter.InvokeOnRemove(item, e);
} }
} }
list.Clear(); list.Clear();

View File

@ -134,7 +134,7 @@ namespace ObservableCollections
{ {
var v = (e.NewItem, selector(e.NewItem)); var v = (e.NewItem, selector(e.NewItem));
queue.Enqueue(v); queue.Enqueue(v);
filter.InvokeOnAdd(v); filter.InvokeOnAdd(v, e);
} }
else else
{ {
@ -142,7 +142,7 @@ namespace ObservableCollections
{ {
var v = (item, selector(item)); var v = (item, selector(item));
queue.Enqueue(v); queue.Enqueue(v);
filter.InvokeOnAdd(v); filter.InvokeOnAdd(v, e);
} }
} }
break; break;
@ -151,7 +151,7 @@ namespace ObservableCollections
if (e.IsSingleItem) if (e.IsSingleItem)
{ {
var v = queue.Dequeue(); var v = queue.Dequeue();
filter.InvokeOnRemove(v.Item1, v.Item2); filter.InvokeOnRemove(v.Item1, v.Item2, e);
} }
else else
{ {
@ -159,7 +159,7 @@ namespace ObservableCollections
for (int i = 0; i < len; i++) for (int i = 0; i < len; i++)
{ {
var v = queue.Dequeue(); var v = queue.Dequeue();
filter.InvokeOnRemove(v.Item1, v.Item2); filter.InvokeOnRemove(v.Item1, v.Item2, e);
} }
} }
break; break;
@ -168,7 +168,7 @@ namespace ObservableCollections
{ {
foreach (var item in queue) foreach (var item in queue)
{ {
filter.InvokeOnRemove(item); filter.InvokeOnRemove(item, e);
} }
} }
queue.Clear(); queue.Clear();

View File

@ -141,7 +141,7 @@ namespace ObservableCollections
{ {
var v = (e.NewItem, selector(e.NewItem)); var v = (e.NewItem, selector(e.NewItem));
ringBuffer.AddFirst(v); ringBuffer.AddFirst(v);
filter.InvokeOnAdd(v); filter.InvokeOnAdd(v, e);
} }
else else
{ {
@ -149,7 +149,7 @@ namespace ObservableCollections
{ {
var v = (item, selector(item)); var v = (item, selector(item));
ringBuffer.AddFirst(v); ringBuffer.AddFirst(v);
filter.InvokeOnAdd(v); filter.InvokeOnAdd(v, e);
} }
} }
} }
@ -160,7 +160,7 @@ namespace ObservableCollections
{ {
var v = (e.NewItem, selector(e.NewItem)); var v = (e.NewItem, selector(e.NewItem));
ringBuffer.AddLast(v); ringBuffer.AddLast(v);
filter.InvokeOnAdd(v); filter.InvokeOnAdd(v, e);
} }
else else
{ {
@ -168,7 +168,7 @@ namespace ObservableCollections
{ {
var v = (item, selector(item)); var v = (item, selector(item));
ringBuffer.AddLast(v); ringBuffer.AddLast(v);
filter.InvokeOnAdd(v); filter.InvokeOnAdd(v, e);
} }
} }
} }
@ -181,14 +181,14 @@ namespace ObservableCollections
if (e.IsSingleItem) if (e.IsSingleItem)
{ {
var v = ringBuffer.RemoveFirst(); var v = ringBuffer.RemoveFirst();
filter.InvokeOnRemove(v); filter.InvokeOnRemove(v, e);
} }
else else
{ {
for (int i = 0; i < e.OldItems.Length; i++) for (int i = 0; i < e.OldItems.Length; i++)
{ {
var v = ringBuffer.RemoveFirst(); var v = ringBuffer.RemoveFirst();
filter.InvokeOnRemove(v); filter.InvokeOnRemove(v, e);
} }
} }
} }
@ -198,14 +198,14 @@ namespace ObservableCollections
if (e.IsSingleItem) if (e.IsSingleItem)
{ {
var v = ringBuffer.RemoveLast(); var v = ringBuffer.RemoveLast();
filter.InvokeOnRemove(v); filter.InvokeOnRemove(v, e);
} }
else else
{ {
for (int i = 0; i < e.OldItems.Length; i++) for (int i = 0; i < e.OldItems.Length; i++)
{ {
var v = ringBuffer.RemoveLast(); var v = ringBuffer.RemoveLast();
filter.InvokeOnRemove(v); filter.InvokeOnRemove(v, e);
} }
} }
} }
@ -215,7 +215,7 @@ namespace ObservableCollections
{ {
foreach (var item in ringBuffer) foreach (var item in ringBuffer)
{ {
filter.InvokeOnRemove(item); filter.InvokeOnRemove(item, e);
} }
} }
ringBuffer.Clear(); ringBuffer.Clear();
@ -228,8 +228,8 @@ namespace ObservableCollections
var oldItem = ringBuffer[e.NewStartingIndex]; var oldItem = ringBuffer[e.NewStartingIndex];
ringBuffer[e.NewStartingIndex] = v; ringBuffer[e.NewStartingIndex] = v;
filter.InvokeOnRemove(oldItem); filter.InvokeOnRemove(oldItem, e);
filter.InvokeOnAdd(v); filter.InvokeOnAdd(v, e);
break; break;
} }
case NotifyCollectionChangedAction.Move: case NotifyCollectionChangedAction.Move:

View File

@ -134,7 +134,7 @@ namespace ObservableCollections
{ {
var v = (e.NewItem, selector(e.NewItem)); var v = (e.NewItem, selector(e.NewItem));
stack.Push(v); stack.Push(v);
filter.InvokeOnAdd(v); filter.InvokeOnAdd(v, e);
} }
else else
{ {
@ -142,7 +142,7 @@ namespace ObservableCollections
{ {
var v = (item, selector(item)); var v = (item, selector(item));
stack.Push(v); stack.Push(v);
filter.InvokeOnAdd(v); filter.InvokeOnAdd(v, e);
} }
} }
break; break;
@ -151,7 +151,7 @@ namespace ObservableCollections
if (e.IsSingleItem) if (e.IsSingleItem)
{ {
var v = stack.Pop(); var v = stack.Pop();
filter.InvokeOnRemove(v.Item1, v.Item2); filter.InvokeOnRemove(v.Item1, v.Item2, e);
} }
else else
{ {
@ -159,7 +159,7 @@ namespace ObservableCollections
for (int i = 0; i < len; i++) for (int i = 0; i < len; i++)
{ {
var v = stack.Pop(); var v = stack.Pop();
filter.InvokeOnRemove(v.Item1, v.Item2); filter.InvokeOnRemove(v.Item1, v.Item2, e);
} }
} }
break; break;
@ -168,7 +168,7 @@ namespace ObservableCollections
{ {
foreach (var item in stack) foreach (var item in stack)
{ {
filter.InvokeOnRemove(item); filter.InvokeOnRemove(item, e);
} }
} }
stack.Clear(); stack.Clear();

View File

@ -2,6 +2,7 @@
using System.Collections; using System.Collections;
using System.Collections.Generic; using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis; using System.Diagnostics.CodeAnalysis;
using System.Linq;
namespace ObservableCollections namespace ObservableCollections
{ {

View File

@ -54,7 +54,7 @@ namespace ObservableCollections.Tests
return this.filter.Invoke(value, view); return this.filter.Invoke(value, view);
} }
public void OnCollectionChanged(ChangedKind changedKind, T value, ViewContainer<T> view) public void OnCollectionChanged(ChangedKind changedKind, T value, ViewContainer<T> view, in NotifyCollectionChangedEventArgs<T> eventArgs)
{ {
CalledOnCollectionChanged.Add((changedKind, value, view)); CalledOnCollectionChanged.Add((changedKind, value, view));
} }
@ -94,7 +94,7 @@ namespace ObservableCollections.Tests
return this.filter.Invoke(value, view); return this.filter.Invoke(value, view);
} }
public void OnCollectionChanged(ChangedKind changedKind, KeyValuePair<T, T> value, ViewContainer<T> view) public void OnCollectionChanged(ChangedKind changedKind, KeyValuePair<T, T> value, ViewContainer<T> view, in NotifyCollectionChangedEventArgs<KeyValuePair<T, T>> eventArgs)
{ {
CalledOnCollectionChanged.Add((changedKind, value, view)); CalledOnCollectionChanged.Add((changedKind, value, view));
} }