/// <summary>
        /// Вспомогательная функция обеспечивает выполнение режима выбора множества элементов в коллекции одновременно.
        /// </summary>
        /// <remarks>
        /// Helper function is used to maintain Multiple items Selection Mode.
        /// </remarks>
        internal void HandleMultipleSelection(object value, bool selectItem = false)
        {
            if (value != null)
            {
                if (SelectedItems.Count == 0)
                {
                    //ни один элемент не был выбран
                    //no item was selected
                    SelectedItems.Clear();
                    UnselectedItems.Clear();

                    SelectedItems.Add(value);
                    if (selectItem)
                    {
                        var itemToSelect = GetItemContainer(value);
                        if (itemToSelect != null)
                        {
                            itemToSelect.IsSelected = true;
                        }
                    }

                    foreach (var node in Items)
                    {
                        if (!Equals(node, value))
                        {
                            UnselectedItems.Add(node);
                        }
                    }
                }
                else
                {
                    if (!SelectedItems.Contains(value))
                    {
                        //в ранее выбранных элементах отсутсвует текущий элемент, добавляем его в список выбранных элементов
                        //in the previously selected items the current element is missing, add it to the list of selected items
                        SelectedItems.Add(value);
                        UnselectedItems.Remove(value);
                    }
                    else
                    {
                        //в ранее выбранных элементах находится текущий, убираем его из списка выбранных элементов
                        //the current item is in the previously selected items, remove it from the list of selected items
                        SelectedItems.Remove(value);
                        UnselectedItems.Add(value);
                    }
                }

                state = ControlState.IgnoreChanges;
                if (SelectedItems.Count != 0)
                {
                    SelectedItem  = SelectedItems[SelectedItems.Count - 1];
                    SelectedIndex = Items.IndexOf(SelectedItem);
                }
                state = ControlState.Ready;
            }
        }
Exemple #2
0
 private void AddItem()
 {
     if (ItemToAdd != null)
     {
         SelectedItems.Add(ItemToAdd);
         UnselectedItems.Remove(ItemToAdd);
         OnPropertyChanged(nameof(SelectedItems));
         OnPropertyChanged(nameof(UnselectedItems));
     }
 }
        /// <summary>
        /// Вспомогательная функция задает состояние элементов и вызывает событие SelectionChanged.
        /// Эта функция обеспечивает выполнение режима выбора множества элементов в коллекции одновременно со сбросом на элемент по умолчанию, если ни один из элементов не выбран.
        /// </summary>
        /// <remarks>
        /// Helper function that sets state of the item and raised SelectionChanged Event.
        /// This function is used to maintain Multiple items Selection Mode with fallback to default.
        /// </remarks>
        internal void HandleMultipleSelectionWithDefault(object value, bool selectItem = false)
        {
            if (value != null)
            {
                if (selectItem)
                {
                    var itemToSelect = GetItemContainer(value);
                    if (itemToSelect != null)
                    {
                        itemToSelect.IsSelected = true;
                    }
                }

                if (SelectedItems.Count == 0)
                {
                    //ни один элемент не был выбран ни разу, выбирает элемент по умолчанию
                    //no item was selected before, so we select default item
                    SelectedItems.Clear();
                    UnselectedItems.Clear();

                    SelectedItems.Add(value);

                    foreach (var node in Items)
                    {
                        if (!Equals(node, value))
                        {
                            UnselectedItems.Add(node);
                        }
                    }
                }
                else
                {
                    if (Equals(value, Items[0]))
                    {
                        //был выбран элемент по умолчанию, снимаем выделения со всех выбранных ранее элементов
                        //default item was selected, so we unselect previously selected items
                        SelectedItems.Clear();
                        UnselectedItems.Clear();

                        SelectedItems.Add(value);
                        ResetItems();

                        RaiseEvent(new SelectionChangedEventArgs(SelectionChangedEvent, UnselectedItems, SelectedItems));
                    }
                    else
                    {
                        if (SelectedItems.Contains(Items[0]))
                        {
                            //был выбран элемент и в выбранных ранее элементах присутсвует элемент по умолчанию, убираем элемент по умолчанию из списка выбранных и добавляем в список выбранных элементов текущий
                            //item was selected after default item selection, so we remove default items from selection and select current item
                            SelectedItems.Remove(Items[0]);
                            UnselectedItems.Add(Items[0]);

                            var defaultItem = GetItemContainer(Items[0]);
                            if (defaultItem != null)
                            {
                                if (defaultItem.IsSelected)
                                {
                                    defaultItem.IsSelected = false;
                                }
                            }

                            SelectedItems.Add(value);
                            UnselectedItems.Remove(value);

                            if (CheckIfItemWasReseted(value))
                            {
                                RaiseEvent(new SelectionChangedEventArgs(SelectionChangedEvent, UnselectedItems, SelectedItems));
                                var selectedItem = GetItemContainer(value);
                                if (selectedItem != null)
                                {
                                    selectedItem.RevertReseted();
                                }
                            }
                        }
                        else
                        {
                            if (!SelectedItems.Contains(value))
                            {
                                //в ранее выбранных элементах отсутсвует текущий элемент, добавляем его в список выбранных элементов
                                //in the previously selected items the current element is missing, add it to the list of selected items
                                SelectedItems.Add(value);
                                UnselectedItems.Remove(value);

                                if (CheckIfItemWasReseted(value))
                                {
                                    RaiseEvent(new SelectionChangedEventArgs(SelectionChangedEvent, UnselectedItems, SelectedItems));
                                    var selectedItem = GetItemContainer(value);
                                    if (selectedItem != null)
                                    {
                                        selectedItem.RevertReseted();
                                    }
                                }
                            }
                            else
                            {
                                //в ранее выбранных элементах находится текущий, убираем его из списка выбранных элементов
                                //the current item is in the previously selected items, remove it from the list of selected items
                                SelectedItems.Remove(value);
                                UnselectedItems.Add(value);

                                if (SelectedItems.Count == 0)
                                {
                                    //если в списке выбранных элементов не осталось ни одного - добавляем в него элемент по умолчанию и выделяем его
                                    //if there are no items left in the list of selected items, add the default item to it and select it
                                    SelectedItems.Add(Items[0]);
                                    UnselectedItems.Remove(Items[0]);

                                    var defaultItem = GetItemContainer(Items[0]);
                                    if (defaultItem != null)
                                    {
                                        defaultItem.IsSelected = true;
                                    }
                                }
                            }
                        }
                    }
                }

                state = ControlState.IgnoreChanges;
                if (SelectedItems.Count != 0)
                {
                    SelectedItem  = SelectedItems[SelectedItems.Count - 1];
                    SelectedIndex = Items.IndexOf(SelectedItem);
                }
                state = ControlState.Ready;
            }
        }