private void OnSelectedIndices_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e) { if (e.Action == NotifyCollectionChangedAction.Add && ChangeSource != ChangeSourceEnum.FromSelectedItems) { var index = (int)e.NewItems[0]; if (index >= Items.Count || index < 0) { if (SelectedIndices.IndexOf(index) != -1) { ChangeSource = ChangeSourceEnum.FromSelectedItems; SelectedIndices.Remove(index); ChangeSource = ChangeSourceEnum.None; } return; } if (SelectedIndices.Where(x => x == index).Count() > 1) { ChangeSource = ChangeSourceEnum.FromSelectedItems; SelectedItems.Remove(index); ChangeSource = ChangeSourceEnum.None; return; } ((MultiSelectItem)itemContainers[index]).IsSelected = true; contentPresenter.Children.Add(GeneratePanelItem(Items[index])); ChangeSource = ChangeSourceEnum.FromSelectedIndices; SelectedItems.Add(Items[index]); if (!(SelectedItems is INotifyCollectionChanged)) { OnSelectedItems_CollectionChanged(this, new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Add, Items[index])); } RaiseEvent(new System.Windows.Controls.SelectionChangedEventArgs(SelectionChangedEvent, new object[0], new object[1] { Items[index] })); } else if (e.Action == NotifyCollectionChangedAction.Remove && ChangeSource != ChangeSourceEnum.FromSelectedItems) { int index = (int)e.OldItems[0]; if (index >= Items.Count || index < 0) { return; } ((MultiSelectItem)itemContainers[index]).IsSelected = false; contentPresenter.Children.RemoveAt(e.OldStartingIndex); ChangeSource = ChangeSourceEnum.FromSelectedIndices; var item = SelectedItems[index]; var indexSelectedItems = SelectedItems.IndexOf(item); SelectedItems.Remove(item); if (!(SelectedItems is INotifyCollectionChanged)) { OnSelectedItems_CollectionChanged(this, new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Remove, item, indexSelectedItems)); } RaiseEvent(new System.Windows.Controls.SelectionChangedEventArgs(SelectionChangedEvent, new object[1] { Items[index] }, new object[0])); } else if (e.Action == NotifyCollectionChangedAction.Reset && ChangeSource != ChangeSourceEnum.FromSelectedItems) { foreach (var item in itemContainers) { ((MultiSelectItem)item).IsSelected = false; } contentPresenter.Children.Clear(); ChangeSource = ChangeSourceEnum.FromSelectedIndices; SelectedItems.Clear(); if (!(SelectedItems is INotifyCollectionChanged)) { OnSelectedItems_CollectionChanged(this, new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset)); } RaiseEvent(new System.Windows.Controls.SelectionChangedEventArgs(SelectionChangedEvent, new object[0], new object[0])); } ChangeSource = ChangeSourceEnum.None; }