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

@ -2,6 +2,7 @@
<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
</PropertyGroup>
<ItemGroup>

View File

@ -7,7 +7,7 @@ namespace ObservableCollections
bool IsMatch(T value, TView view);
void WhenTrue(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
@ -35,14 +35,14 @@ namespace ObservableCollections
public bool IsMatch(T value, TView view) => isMatch(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 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>
{
public bool IsMatch(T value, TView view) => true;
public void WhenFalse(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;
}
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))
{
@ -83,27 +83,27 @@ namespace ObservableCollections
{
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)

View File

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

View File

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

View File

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

View File

@ -121,14 +121,14 @@ namespace ObservableCollections
{
var v = selector(e.NewItem);
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;
case NotifyCollectionChangedAction.Remove:
{
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;
@ -136,12 +136,12 @@ namespace ObservableCollections
{
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);
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;
case NotifyCollectionChangedAction.Reset:
@ -150,7 +150,7 @@ namespace ObservableCollections
{
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));
dict.Add(e.NewItem, v);
filter.InvokeOnAdd(v);
filter.InvokeOnAdd(v, e);
}
else
{
@ -126,7 +126,7 @@ namespace ObservableCollections
{
var v = (item, selector(item));
dict.Add(item, v);
filter.InvokeOnAdd(v);
filter.InvokeOnAdd(v, e);
}
}
break;
@ -135,7 +135,7 @@ namespace ObservableCollections
{
if (dict.Remove(e.OldItem, out var value))
{
filter.InvokeOnRemove(value.Item1, value.Item2);
filter.InvokeOnRemove(value.Item1, value.Item2, e);
}
}
else
@ -144,7 +144,7 @@ namespace ObservableCollections
{
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)
{
filter.InvokeOnRemove(item.Value);
filter.InvokeOnRemove(item.Value, e);
}
}
dict.Clear();

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -7,7 +7,7 @@ namespace ObservableCollections
bool IsMatch(T value, TView view);
void WhenTrue(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
@ -35,14 +35,14 @@ namespace ObservableCollections
public bool IsMatch(T value, TView view) => isMatch(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 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>
{
public bool IsMatch(T value, TView view) => true;
public void WhenFalse(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;
}
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))
{
@ -83,27 +83,27 @@ namespace ObservableCollections
{
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)

View File

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

View File

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

View File

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

View File

@ -121,14 +121,14 @@ namespace ObservableCollections
{
var v = selector(e.NewItem);
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;
case NotifyCollectionChangedAction.Remove:
{
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;
@ -136,12 +136,12 @@ namespace ObservableCollections
{
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);
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;
case NotifyCollectionChangedAction.Reset:
@ -150,7 +150,7 @@ namespace ObservableCollections
{
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));
dict.Add(e.NewItem, v);
filter.InvokeOnAdd(v);
filter.InvokeOnAdd(v, e);
}
else
{
@ -126,7 +126,7 @@ namespace ObservableCollections
{
var v = (item, selector(item));
dict.Add(item, v);
filter.InvokeOnAdd(v);
filter.InvokeOnAdd(v, e);
}
}
break;
@ -135,7 +135,7 @@ namespace ObservableCollections
{
if (dict.Remove(e.OldItem, out var value))
{
filter.InvokeOnRemove(value.Item1, value.Item2);
filter.InvokeOnRemove(value.Item1, value.Item2, e);
}
}
else
@ -144,7 +144,7 @@ namespace ObservableCollections
{
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)
{
filter.InvokeOnRemove(item.Value);
filter.InvokeOnRemove(item.Value, e);
}
}
dict.Clear();

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -54,7 +54,7 @@ namespace ObservableCollections.Tests
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));
}
@ -94,7 +94,7 @@ namespace ObservableCollections.Tests
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));
}