コード例 #1
0
ファイル: MultiSelect.cs プロジェクト: hossein-abdn/Infra.Wpf
        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;
        }