/// <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; } }
private void RemoveItem() { if (ItemToRemove != null) { UnselectedItems.Add(ItemToRemove); SelectedItems.Remove(ItemToRemove); OnPropertyChanged(nameof(SelectedItems)); OnPropertyChanged(nameof(UnselectedItems)); } }
/// <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(); } } } } }
/// <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; } } } } } }
/// <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; } }
/// <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); } } }