public UIElement this[int index] { get { return(children[index]); } set { if (children[index] == value) { return; } NotifyCollectionChangedEventArgs args = NotifyCollectionChangedEventArgs.Replace(children[index], value, index); if (children[index] != null) { ClearChildParent(children[index]); } children[index] = value; if (children[index] != null) { SetChildParent(children[index]); } CollectionChanged.Raise(this, args); } }
private void OnSourceCollectionChanged(object sender, NotifyCollectionChangedEventArgs e) { object[] oldInnerCollection = innerCollection; innerCollection = TranslateCollection(SourceCollection.Cast <object>(), filterPredicate, sortKeySelector, sortDirection).ToArray(); if (innerCollection.Contains(CurrentItem)) { SetCurrent(CurrentItem); } else { SetCurrent(CurrentItemIndex >= oldInnerCollection.Length ? innerCollection.Length : CurrentItemIndex); } IEnumerable <object> oldItems = e.OldItems.Intersect(oldInnerCollection).ToArray(); IEnumerable <object> newItems = e.NewItems.Intersect(innerCollection).ToArray(); if (oldItems.Count() > 1 || newItems.Count() > 1) { CollectionChanged.Raise(this, NotifyCollectionChangedEventArgs.Reset(oldInnerCollection, innerCollection)); return; } object oldItem = e.OldItems.FirstOrDefault(); int oldIndex = Granular.Compatibility.Array.FindIndex(oldInnerCollection, item => Granular.Compatibility.EqualityComparer <object> .Default.Equals(item, oldItem)); object newItem = e.NewItems.FirstOrDefault(); int newIndex = Granular.Compatibility.Array.FindIndex(innerCollection, item => Granular.Compatibility.EqualityComparer <object> .Default.Equals(item, newItem)); if (oldIndex == -1 && newIndex == -1 || oldItem == newItem && oldIndex == newIndex) { return; } if (Granular.Compatibility.EqualityComparer <object> .Default.Equals(oldItem, newItem)) { CollectionChanged.Raise(this, NotifyCollectionChangedEventArgs.Move(newItem, oldIndex, newIndex)); } else if (oldIndex == newIndex) { CollectionChanged.Raise(this, NotifyCollectionChangedEventArgs.Replace(oldItem, newItem, newIndex)); } else { if (oldIndex != -1) { CollectionChanged.Raise(this, NotifyCollectionChangedEventArgs.Remove(oldItem, oldIndex)); } if (newIndex != -1) { CollectionChanged.Raise(this, NotifyCollectionChangedEventArgs.Add(newItem, newIndex)); } } }