/// <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 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; } }