ISynchronizedViewFilter.OnCollectionChanged receives NCCEARGS
This commit is contained in:
parent
c2d1cf1989
commit
09ebd9aba4
@ -1,11 +1,12 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk.Web">
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFramework>net6.0</TargetFramework>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup>
|
||||
<TargetFramework>net6.0</TargetFramework>
|
||||
<ImplicitUsings>enable</ImplicitUsings>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\..\src\ObservableCollections\ObservableCollections.csproj" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\..\src\ObservableCollections\ObservableCollections.csproj" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
|
@ -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)
|
||||
|
@ -3,6 +3,7 @@ using System.Buffers;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using System.Runtime.CompilerServices;
|
||||
using System.Linq;
|
||||
|
||||
namespace ObservableCollections.Internal
|
||||
{
|
||||
|
@ -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();
|
||||
|
@ -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();
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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();
|
||||
|
@ -3,6 +3,7 @@ using System;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics.CodeAnalysis;
|
||||
using System.Linq;
|
||||
|
||||
namespace ObservableCollections
|
||||
{
|
||||
|
@ -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();
|
||||
|
@ -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();
|
||||
|
@ -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:
|
||||
|
@ -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();
|
||||
|
@ -2,6 +2,7 @@ using System;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics.CodeAnalysis;
|
||||
using System.Linq;
|
||||
|
||||
namespace ObservableCollections
|
||||
{
|
||||
|
@ -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)
|
||||
|
@ -3,6 +3,7 @@ using System.Buffers;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using System.Runtime.CompilerServices;
|
||||
using System.Linq;
|
||||
|
||||
namespace ObservableCollections.Internal
|
||||
{
|
||||
|
@ -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();
|
||||
|
@ -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();
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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();
|
||||
|
@ -3,6 +3,7 @@ using System;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics.CodeAnalysis;
|
||||
using System.Linq;
|
||||
|
||||
namespace ObservableCollections
|
||||
{
|
||||
|
@ -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();
|
||||
|
@ -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();
|
||||
|
@ -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:
|
||||
|
@ -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();
|
||||
|
@ -2,6 +2,7 @@
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics.CodeAnalysis;
|
||||
using System.Linq;
|
||||
|
||||
namespace ObservableCollections
|
||||
{
|
||||
|
@ -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));
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user