void SetupCollectionItems <T>(IReactiveList <T> src, IReactiveList <IHierarchicalLibraryItem> dst, Func <T, bool> predicate = null) where T : Collection { lock (src) { var srcF = predicate == null ? src : src.Where(predicate); lock (dst) dst.AddRange(srcF.Select(CreateCustomModSet)); _disposables.Add(src.TrackChanges( x => dst.AddLocked(CreateCustomModSet(x)), x => { lock (CollectionsGroup.Children) dst.RemoveLocked(GetCollection(x)); }, reset => { lock (dst) { lock (CollectionsGroup.Children) dst.RemoveAll(GetCollections().ToArray()); dst.AddRange(reset.Select(CreateCustomModSet)); } }, predicate)); } }