diff --git a/src/ObservableCollections/ISynchronizedViewFilter.cs b/src/ObservableCollections/ISynchronizedViewFilter.cs index 9f4b32b..0a080a9 100644 --- a/src/ObservableCollections/ISynchronizedViewFilter.cs +++ b/src/ObservableCollections/ISynchronizedViewFilter.cs @@ -81,7 +81,7 @@ namespace ObservableCollections filteredCount--; if (ev != null) { - ev.Invoke(new SynchronizedViewChangedEventArgs(NotifyCollectionChangedAction.Remove, isMatch, oldValue: value, oldView: view, oldViewIndex: oldIndex)); + ev.Invoke(new SynchronizedViewChangedEventArgs(NotifyCollectionChangedAction.Remove, oldValue: value, oldView: view, oldViewIndex: oldIndex)); } } } @@ -115,26 +115,31 @@ namespace ObservableCollections var newMatched = collection.CurrentFilter.IsMatch(value); var bothMatched = oldMatched && newMatched; - // TODO:...! if (bothMatched) { + if (ev != null) + { + ev.Invoke(new SynchronizedViewChangedEventArgs(NotifyCollectionChangedAction.Replace, newValue: value, newView: view, oldValue: oldValue, oldView: oldView, newViewIndex: index, oldViewIndex: oldIndex >= 0 ? oldIndex : index)); + } } else if (oldMatched) { // only-old is remove + filteredCount--; + if (ev != null) + { + ev.Invoke(new SynchronizedViewChangedEventArgs(NotifyCollectionChangedAction.Remove, oldValue: value, oldView: view, oldViewIndex: oldIndex)); + } + } else if (newMatched) { // only-new is add - } - - - - - if (ev != null) - { - var isMatch = collection.CurrentFilter.IsMatch(value); - ev.Invoke(new SynchronizedViewChangedEventArgs(NotifyCollectionChangedAction.Replace, isMatch, newValue: value, newView: view, oldValue: oldValue, oldView: oldView, newViewIndex: index, oldViewIndex: oldIndex >= 0 ? oldIndex : index)); + filteredCount++; + if (ev != null) + { + ev.Invoke(new SynchronizedViewChangedEventArgs(NotifyCollectionChangedAction.Add, newValue: value, newView: view, newViewIndex: index)); + } } } @@ -143,19 +148,7 @@ namespace ObservableCollections filteredCount = 0; if (ev != null) { - ev.Invoke(new SynchronizedViewChangedEventArgs(NotifyCollectionChangedAction.Reset, true)); - } - } - - internal static void InvokeOnAttach(this ISynchronizedViewFilter filter, T value, TView view) - { - if (filter.IsMatch(value, view)) - { - filter.WhenTrue(value, view); - } - else - { - filter.WhenFalse(value, view); + ev.Invoke(new SynchronizedViewChangedEventArgs(NotifyCollectionChangedAction.Reset)); } } } diff --git a/src/ObservableCollections/ObservableList.Views.cs b/src/ObservableCollections/ObservableList.Views.cs index eac67a2..8ec2beb 100644 --- a/src/ObservableCollections/ObservableList.Views.cs +++ b/src/ObservableCollections/ObservableList.Views.cs @@ -16,7 +16,7 @@ namespace ObservableCollections internal sealed class View : ISynchronizedView { - public ISynchronizedViewFilter CurrentFilter + public ISynchronizedViewFilter CurrentFilter { get { @@ -30,10 +30,9 @@ namespace ObservableCollections readonly List<(T, TView)> list; int filteredCount; - ISynchronizedViewFilter filter; + ISynchronizedViewFilter filter; public event Action>? ViewChanged; - // public event NotifyCollectionChangedEventHandler? RoutingCollectionChanged; public event Action? CollectionStateChanged; public object SyncRoot { get; } @@ -43,7 +42,7 @@ namespace ObservableCollections this.source = source; this.selector = selector; this.reverse = reverse; - this.filter = SynchronizedViewFilter.Null; + this.filter = SynchronizedViewFilter.Null; this.SyncRoot = new object(); lock (source.SyncRoot) { @@ -64,7 +63,7 @@ namespace ObservableCollections } } - public void AttachFilter(ISynchronizedViewFilter filter, bool invokeAddEventForCurrentElements = false) + public void AttachFilter(ISynchronizedViewFilter filter, bool invokeAddEventForCurrentElements = false) { lock (SyncRoot) { @@ -84,11 +83,11 @@ namespace ObservableCollections } } - public void ResetFilter(Action? resetAction) + public void ResetFilter(Action? resetAction) { lock (SyncRoot) { - this.filter = SynchronizedViewFilter.Null; + this.filter = SynchronizedViewFilter.Null; if (resetAction != null) { foreach (var (item, view) in list)