private void SelectWithShift(TreeViewExItem item) { object firstSelectedItem; if (lastShiftRoot != null) { firstSelectedItem = lastShiftRoot; } else { if (treeViewEx.SelectedItems.Count > 0) { firstSelectedItem = treeViewEx.SelectedItems[0]; } else { firstSelectedItem = null; } } TreeViewExItem shiftRootItem = treeViewEx.GetTreeViewItemsFor(new List <object> { firstSelectedItem }).First(); List <object> itemsToSelect = treeViewEx.GetNodesToSelectBetween(shiftRootItem, item).Select(x => x.DataContext).ToList(); List <object> itemsToUnSelect = ((IEnumerable <object>)treeViewEx.SelectedItems).ToList(); ModifySelection(itemsToSelect, itemsToUnSelect); }
private void SelectWithShift(TreeViewExItem item) { object firstSelectedItem; if (lastShiftRoot != null) { firstSelectedItem = lastShiftRoot; } else { // Get the first item in the SelectedItems that is also bound to the Tree. firstSelectedItem = treeViewEx.SelectedItems.Cast <object>().FirstOrDefault((x) => { return(treeViewEx.GetTreeViewItemFor(x) != null); }); } if (firstSelectedItem != null) { TreeViewExItem shiftRootItem = treeViewEx.GetTreeViewItemsFor(new List <object> { firstSelectedItem }).First(); List <object> itemsToSelect = treeViewEx.GetNodesToSelectBetween(shiftRootItem, item).Select(x => x.DataContext).ToList(); List <object> itemsToUnSelect = treeViewEx.SelectedItems.Cast <object>().ToList(); ModifySelection(itemsToSelect, itemsToUnSelect); } else { // Fall-back to sigle selection List <object> itemsToUnSelect = treeViewEx.SelectedItems.Cast <object>().ToList(); if (itemsToUnSelect.Contains(item.DataContext)) { itemsToUnSelect.Remove(item.DataContext); } ModifySelection(item.DataContext, itemsToUnSelect); } }
private IList <object> GetDraggableItems(Point mousePositionRelativeToTree) { var items = treeViewEx.GetTreeViewItemsFor(treeViewEx.SelectedItems).ToList(); foreach (var item in items) { if (item.DragCommand == null || !item.DragCommand.CanExecute(null)) { // if one item is not draggable, nothing can be dragged return(new List <object>()); } } TreeViewExItem itemUnderMouse = GetTreeViewItemUnderMouse(treeViewEx, mousePositionRelativeToTree); // if no selected item is under mouse if (!items.Contains(itemUnderMouse)) { return(new List <object>()); } return(treeViewEx.SelectedItems.Cast <object>().ToList()); }
private void SelectCore(TreeViewExItem item) { if (IsControlKeyDown) { if (!treeViewEx.CheckSelectionAllowed(item.DataContext, true)) { return; } if (treeViewEx.SelectedItems.Contains(item.DataContext)) { throw new InvalidOperationException("The item must not be contained."); } treeViewEx.SelectedItems.Add(item.DataContext); item.IsSelected = true; lastShiftRoot = item.DataContext; } else if (IsShiftKeyDown && treeViewEx.SelectedItems.Count > 0) { object firstSelectedItem = lastShiftRoot ?? treeViewEx.SelectedItems.First(); TreeViewExItem shiftRootItem = treeViewEx.GetTreeViewItemsFor(new List <object> { firstSelectedItem }).First(); IEnumerable <object> items = treeViewEx.GetNodesToSelectBetween(shiftRootItem, item).Select(x => x.DataContext); IEnumerable <object> itemsToSelect = GetItemsNotInCollection((IEnumerable <object>)treeViewEx.SelectedItems, items); IEnumerable <object> itemsToUnSelect = GetItemsNotInCollection(items, (IEnumerable <object>)treeViewEx.SelectedItems); if (!treeViewEx.CheckSelectionAllowed(itemsToSelect, itemsToUnSelect)) { return; } treeViewEx.SelectedItems.Clear(); foreach (var node in TreeViewEx.RecursiveTreeViewItemEnumerable(treeViewEx, false)) { if (items.Contains(node.DataContext)) { treeViewEx.SelectedItems.Add(node.DataContext); node.IsSelected = true; } else { node.IsSelected = false; } } } else { if (!treeViewEx.CheckSelectionAllowed(item.DataContext, true)) { return; } // check if selection is already item, otherwise set it if (!(treeViewEx.SelectedItems.Count == 1 && treeViewEx.SelectedItems[0] == item.DataContext)) { foreach (var treeViewItem in TreeViewEx.RecursiveTreeViewItemEnumerable(treeViewEx, false)) { treeViewItem.IsSelected = false; } treeViewEx.SelectedItems.Clear(); treeViewEx.SelectedItems.Add(item.DataContext); } lastShiftRoot = item.DataContext; } FocusHelper.Focus(item); }