public static void SynchronizeToView <T>(this IEnumerable <T> sourceCollection, ObservableCollection <T> targetView, Func <T, bool> filterFunc, CollectionSynchronizationMode mode, bool disposeRemovedItems = false) { var qualifyingItems = sourceCollection.Where(filterFunc).ToList(); // Remove non-qualifying items from target. foreach (var i in targetView.Except(qualifyingItems).ToArray()) { targetView.Remove(i); if (disposeRemovedItems && i is IDisposable disposableItem) { disposableItem.Dispose(); } } // Add qualifying items to target. for (var sourceIndex = 0; sourceIndex < qualifyingItems.Count; sourceIndex++) { var sourceItem = qualifyingItems[sourceIndex]; var targetIndex = targetView.IndexOf(sourceItem); if (!targetView.Contains(sourceItem)) { targetView.Insert(sourceIndex, sourceItem); } else if (targetIndex > sourceIndex) { // Maintain source order in target if so instructed. if (mode == CollectionSynchronizationMode.KeepOrderByMove) { targetView.Move(targetIndex, sourceIndex); } else if (mode == CollectionSynchronizationMode.KeepOrderByRemoveInsert) { targetView.Remove(sourceItem); targetView.Insert(sourceIndex, sourceItem); } } } }
public static void SynchronizeToView <T>(this IEnumerable <T> sourceCollection, ObservableCollection <T> targetView, CollectionSynchronizationMode mode, bool disposeRemovedItems = false) { SynchronizeToView(sourceCollection, targetView, i => true, mode, disposeRemovedItems); }