Beispiel #1
0
        /// <summary>
        /// Вспомогательная функция задает состояние элементов и вызывает событие SelectionChanged если задано raiseEvent в значении true.
        /// Эта функция обеспечивает выполнение режима выбора одиночного элемента в коллекции одновременно.
        /// </summary>
        /// <remarks>
        /// Helper function that sets state of the item and raised SelectionChanged Event if raiseEvent is set to true.
        /// This function is used to maintain Single item Selection Mode.
        /// </remarks>
        internal void HandleSingleSelection(object value, bool raiseEvent, bool selectItem = false)
        {
            if (value != null)
            {
                SelectedItems.Clear();
                UnselectedItems.Clear();

                SelectedItems.Add(value);
                FillUnselected(value, true);

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

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

                if (raiseEvent)
                {
                    RaiseEvent(new SelectionChangedEventArgs(SelectionChangedEvent, UnselectedItems, SelectedItems));
                }
            }
        }
Beispiel #2
0
        /// <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;
            }
        }
Beispiel #3
0
 private void RemoveItem()
 {
     if (ItemToRemove != null)
     {
         UnselectedItems.Add(ItemToRemove);
         SelectedItems.Remove(ItemToRemove);
         OnPropertyChanged(nameof(SelectedItems));
         OnPropertyChanged(nameof(UnselectedItems));
     }
 }
Beispiel #4
0
 private void AddItem()
 {
     if (ItemToAdd != null)
     {
         SelectedItems.Add(ItemToAdd);
         UnselectedItems.Remove(ItemToAdd);
         OnPropertyChanged(nameof(SelectedItems));
         OnPropertyChanged(nameof(UnselectedItems));
     }
 }
Beispiel #5
0
 /// <summary>
 /// Вспомогательная функция для режима выбора множества элементов, задает состояние IsSelected, и ResetedByDefaultItem, а так же заполняет список коллекции UnselectedItems
 /// </summary>
 /// <remarks>
 /// Helper function that sets private property ResetedByDefaultItem of items to true and deselected they, then items added to UnselectedItems collection
 /// This function is used in Multiple items Selection Mode with fallback to default
 /// </remarks>
 private void ResetItems()
 {
     foreach (var item in Items)
     {
         if (Items.IndexOf(item) != 0)
         {
             UnselectedItems.Add(item);
             var itemContainer = GetItemContainer(item);
             if (itemContainer != null)
             {
                 if (itemContainer.IsSelected)
                 {
                     itemContainer.IsSelected = false;
                     itemContainer.SetReseted();
                 }
             }
         }
     }
 }
Beispiel #6
0
        /// <summary>
        /// Вспомогательная функция для режима выбора одного элемента, задает состояние IsSelected если оно указано и заполняет список коллекции UnselectedItems
        /// </summary>
        /// <remarks>
        /// Helper function that sets items state if state value is specified, and filled UnselectedItems collection
        /// This function is used in Single item Selection Mode
        /// </remarks>
        private void FillUnselected(object excludedValue, bool setItemsToState = false)
        {
            foreach (var item in Items)
            {
                if (!Equals(item, excludedValue))
                {
                    var itemContainer = GetItemContainer(item);
                    if (itemContainer != null)
                    {
                        if (!itemContainer.IsSelected && !UnselectedItems.Contains(item))
                        {
                            UnselectedItems.Add(item);
                        }
                        else if (itemContainer.IsSelected && !UnselectedItems.Contains(item))
                        {
                            if (setItemsToState)
                            {
                                itemContainer.IsSelected = false;

                                if (!itemContainer.IsSelected)
                                {
                                    UnselectedItems.Add(item);
                                }
                            }
                        }
                        else if (itemContainer.IsSelected && UnselectedItems.Contains(item))
                        {
                            if (setItemsToState)
                            {
                                itemContainer.IsSelected = false;
                            }
                        }
                    }
                }
            }
        }
Beispiel #7
0
        /// <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;
            }
        }
Beispiel #8
0
        /// <summary>
        /// Задает свойства контейнера элемента для отображения,
        /// а так же устанавливает значения IsSelected если задано свойство SelectedIndex или SelectedItem
        /// </summary>
        /// <remarks>
        /// Prepare the element to display the item,
        /// depending on SelectionMode of elements and specified SelectedIndex or SelectedItem
        /// </remarks>
        protected override void PrepareContainerForItemOverride(DependencyObject element, object item)
        {
            base.PrepareContainerForItemOverride(element, item);

            if (SelectedIndex == -1 && SelectedItem == null)
            {
                if (SelectionMode == SelectionModeEnum.MultipleWithDefault)
                {
                    if (Items.IndexOf(item) == 0)
                    {
                        (element as UIEnumSwitchItem).MultipleSelectionWithDefault(true, SelectionAction.FirstSelection);
                    }
                    else
                    {
                        if (!UnselectedItems.Contains(item))
                        {
                            UnselectedItems.Add(item);
                        }
                    }
                }
            }
            else if (SelectedIndex != -1)
            {
                if (SelectedIndex == Items.IndexOf(item))
                {
                    if (SelectionMode == SelectionModeEnum.Single)
                    {
                        (element as UIEnumSwitchItem).SingleSelection(true, SelectionAction.FirstSelection);
                    }
                    else if (SelectionMode == SelectionModeEnum.MultipleWithDefault)
                    {
                        (element as UIEnumSwitchItem).MultipleSelectionWithDefault(true, SelectionAction.FirstSelection);
                    }
                    else if (SelectionMode == SelectionModeEnum.Multiple)
                    {
                        (element as UIEnumSwitchItem).MultipleSelection(true, SelectionAction.FirstSelection);
                    }
                }
                else
                {
                    if (!UnselectedItems.Contains(item))
                    {
                        UnselectedItems.Add(item);
                    }
                }
            }
            else if (SelectedItem != null)
            {
                if (Equals(item, SelectedItem))
                {
                    if (SelectionMode == SelectionModeEnum.Single)
                    {
                        (element as UIEnumSwitchItem).SingleSelection(true, SelectionAction.FirstSelection);
                    }
                    else if (SelectionMode == SelectionModeEnum.MultipleWithDefault)
                    {
                        (element as UIEnumSwitchItem).MultipleSelectionWithDefault(true, SelectionAction.FirstSelection);
                    }
                    else if (SelectionMode == SelectionModeEnum.Multiple)
                    {
                        (element as UIEnumSwitchItem).MultipleSelection(true, SelectionAction.FirstSelection);
                    }
                }
                else
                {
                    if (!UnselectedItems.Contains(item))
                    {
                        UnselectedItems.Add(item);
                    }
                }
            }

            if (ShowDescriptionInTooltip)
            {
                if ((item as Enum).GetAttributeOfType <DescriptionAttribute>() != null)
                {
                    var description = (item as Enum).GetAttributeOfType <DescriptionAttribute>().Description;
                    if (description != string.Empty)
                    {
                        (element as UIEnumSwitchItem).ToolTip = description;
                    }
                }
            }

            if (SeparateItems)
            {
                BorderThickness = new Thickness(0);

                (element as UIEnumSwitchItem).CornerRadius    = CornerRadius;
                (element as UIEnumSwitchItem).BorderThickness = new Thickness(1);

                if (Items.Count == 1)
                {
                    (element as UIEnumSwitchItem).Margin = new Thickness(0);
                }
                else if (Items.IndexOf(item) == 0)
                {
                    (element as UIEnumSwitchItem).Margin = new Thickness(0, 0, 2, 0);
                }
                else if (Items.IndexOf(item) == Items.Count - 1)
                {
                    (element as UIEnumSwitchItem).Margin = new Thickness(2, 0, 0, 0);
                }
                else
                {
                    (element as UIEnumSwitchItem).Margin = new Thickness(2, 0, 2, 0);
                }
            }
            else
            {
                (element as UIEnumSwitchItem).Margin = new Thickness(0);

                if (Items.Count == 1)
                {
                    (element as UIEnumSwitchItem).CornerRadius    = CornerRadius;
                    (element as UIEnumSwitchItem).BorderThickness = new Thickness(1);
                }
                else if (Items.IndexOf(item) == 0)
                {
                    (element as UIEnumSwitchItem).CornerRadius    = new CornerRadius(CornerRadius.TopLeft, 0d, 0d, CornerRadius.BottomLeft);
                    (element as UIEnumSwitchItem).BorderThickness = new Thickness(1, 1, 0, 1);
                }
                else if (Items.IndexOf(item) == Items.Count - 1)
                {
                    (element as UIEnumSwitchItem).CornerRadius    = new CornerRadius(0d, CornerRadius.TopRight, CornerRadius.BottomRight, 0d);
                    (element as UIEnumSwitchItem).BorderThickness = new Thickness(0, 1, 1, 1);
                }
                else
                {
                    (element as UIEnumSwitchItem).CornerRadius    = new CornerRadius(0);
                    (element as UIEnumSwitchItem).BorderThickness = new Thickness(0, 1, 0, 1);
                }
            }
        }