Example #1
0
        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);
                    }
                }
            }
        }
Example #2
0
 public static void SynchronizeToView <T>(this IEnumerable <T> sourceCollection, ObservableCollection <T> targetView, CollectionSynchronizationMode mode, bool disposeRemovedItems = false)
 {
     SynchronizeToView(sourceCollection, targetView, i => true, mode, disposeRemovedItems);
 }