From b577d9a226e3cf2dfa8648270da55f13f65b2f95 Mon Sep 17 00:00:00 2001 From: neuecc Date: Thu, 12 Aug 2021 18:04:47 +0900 Subject: [PATCH] Move is Move --- .../ISynchronizedViewFilter.cs | 12 ++++++- .../ObservableDictionary.Views.cs | 6 ++-- .../ObservableList.Views.cs | 34 +++++++++++++------ 3 files changed, 38 insertions(+), 14 deletions(-) diff --git a/src/ObservableCollections/ISynchronizedViewFilter.cs b/src/ObservableCollections/ISynchronizedViewFilter.cs index 2974f0f..ebbfe37 100644 --- a/src/ObservableCollections/ISynchronizedViewFilter.cs +++ b/src/ObservableCollections/ISynchronizedViewFilter.cs @@ -12,7 +12,7 @@ namespace ObservableCollections public enum ChangedKind { - Add, Remove + Add, Remove, Move } public class SynchronizedViewFilter : ISynchronizedViewFilter @@ -96,6 +96,16 @@ namespace ObservableCollections filter.OnCollectionChanged(ChangedKind.Remove, value, view); } + internal static void InvokeOnMove(this ISynchronizedViewFilter filter, (T value, TView view) value) + { + InvokeOnMove(filter, value.value, value.view); + } + + internal static void InvokeOnMove(this ISynchronizedViewFilter filter, T value, TView view) + { + filter.OnCollectionChanged(ChangedKind.Move, value, view); + } + internal static void InvokeOnAttach(this ISynchronizedViewFilter filter, T value, TView view) { if (filter.IsMatch(value, view)) diff --git a/src/ObservableCollections/ObservableDictionary.Views.cs b/src/ObservableCollections/ObservableDictionary.Views.cs index 072f97d..a1e046b 100644 --- a/src/ObservableCollections/ObservableDictionary.Views.cs +++ b/src/ObservableCollections/ObservableDictionary.Views.cs @@ -145,7 +145,6 @@ namespace ObservableCollections } } break; - case NotifyCollectionChangedAction.Move: case NotifyCollectionChangedAction.Replace: { if (dict.Remove(e.OldItem.Key, out var oldView)) @@ -171,6 +170,7 @@ namespace ObservableCollections dict.Clear(); } break; + case NotifyCollectionChangedAction.Move: // ObservableDictionary have no Move operation. default: break; } @@ -295,7 +295,6 @@ namespace ObservableCollections } } break; - case NotifyCollectionChangedAction.Move: case NotifyCollectionChangedAction.Replace: { var k = new KeyValuePair(e.OldItem.Key, e.OldItem.Value); @@ -322,6 +321,7 @@ namespace ObservableCollections dict.Clear(); } break; + case NotifyCollectionChangedAction.Move: // ObservableDictionary have no Move operation. default: break; } @@ -454,7 +454,6 @@ namespace ObservableCollections } } break; - case NotifyCollectionChangedAction.Move: case NotifyCollectionChangedAction.Replace: { if (viewMap.Remove(e.OldItem.Key, out var view)) @@ -485,6 +484,7 @@ namespace ObservableCollections viewMap.Clear(); } break; + case NotifyCollectionChangedAction.Move: // ObservableDictionary have no Move operation. default: break; } diff --git a/src/ObservableCollections/ObservableList.Views.cs b/src/ObservableCollections/ObservableList.Views.cs index 646820e..09e9c5f 100644 --- a/src/ObservableCollections/ObservableList.Views.cs +++ b/src/ObservableCollections/ObservableList.Views.cs @@ -1,9 +1,6 @@ using ObservableCollections.Internal; -using System; using System.Collections; -using System.Collections.Generic; using System.Collections.Specialized; -using System.Linq; namespace ObservableCollections { @@ -211,9 +208,7 @@ namespace ObservableCollections list.RemoveAt(e.OldStartingIndex); list.Insert(e.NewStartingIndex, removeItem); - // TODO:??? - //filter.InvokeOnRemove(removeItem); - //filter.InvokeOnAdd(v); + filter.InvokeOnMove(removeItem); } break; case NotifyCollectionChangedAction.Reset: @@ -380,9 +375,8 @@ namespace ObservableCollections } break; case NotifyCollectionChangedAction.Replace: - case NotifyCollectionChangedAction.Move: // ObservableList does not support replace range - // Replace is remove old item and insert new item(same index on replace, difference index on move). + // Replace is remove old item and insert new item. { var oldValue = e.OldItem; list.Remove((oldValue, identitySelector(oldValue)), out var oldView); @@ -396,6 +390,16 @@ namespace ObservableCollections filter.InvokeOnAdd(value, view); } break; + case NotifyCollectionChangedAction.Move: + { + // Move(index change) does not affect sorted list. + var oldValue = e.OldItem; + if (list.TryGetValue((oldValue, identitySelector(oldValue)), out var view)) + { + filter.InvokeOnMove(view); + } + } + break; case NotifyCollectionChangedAction.Reset: if (!filter.IsNullFilter()) { @@ -593,9 +597,8 @@ namespace ObservableCollections } break; case NotifyCollectionChangedAction.Replace: - case NotifyCollectionChangedAction.Move: // ObservableList does not support replace range - // Replace is remove old item and insert new item(same index on replace, difference index on move). + // Replace is remove old item and insert new item. { var oldValue = e.OldItem; var oldKey = identitySelector(oldValue); @@ -614,6 +617,17 @@ namespace ObservableCollections filter.InvokeOnAdd(value, view); } break; + case NotifyCollectionChangedAction.Move: + // Move(index change) does not affect soreted dict. + { + var value = e.OldItem; + var key = identitySelector(value); + if (viewMap.TryGetValue(key, out var view)) + { + filter.InvokeOnMove(value, view); + } + } + break; case NotifyCollectionChangedAction.Reset: if (!filter.IsNullFilter()) {