public bool SelectCore(MultiSelectTreeViewItem item) { if (IsControlKeyDown) { if (!treeView.SelectedItems.Contains(item.DataContext)) { treeView.SelectedItems.Add(item.DataContext); } lastShiftRoot = item.DataContext; } else if (IsShiftKeyDown && treeView.SelectedItems.Count > 0) { object firstSelectedItem = lastShiftRoot ?? treeView.SelectedItems.First(); MultiSelectTreeViewItem shiftRootItem = treeView.GetTreeViewItemsFor(new List <object> { firstSelectedItem }).First(); var newSelection = treeView.GetNodesToSelectBetween(shiftRootItem, item).Select(n => n.DataContext).ToList(); // Make a copy of the list because we're modifying it while enumerating it var selectedItems = new object[treeView.SelectedItems.Count]; treeView.SelectedItems.CopyTo(selectedItems, 0); // Remove all items no longer selected foreach (var selItem in selectedItems.Where(i => !newSelection.Contains(i))) { var e = new PreviewSelectionChangedEventArgs(false, selItem); OnPreviewSelectionChanged(e); if (e.CancelAll) { FocusHelper.Focus(item); return(false); } if (!e.CancelThis) { treeView.SelectedItems.Remove(selItem); } } // Add new selected items foreach (var newItem in newSelection.Where(i => !selectedItems.Contains(i))) { var e = new PreviewSelectionChangedEventArgs(true, newItem); OnPreviewSelectionChanged(e); if (e.CancelAll) { FocusHelper.Focus(item, true); return(false); } if (!e.CancelThis) { treeView.SelectedItems.Add(newItem); } } } else { if (treeView.SelectedItems.Count > 0) { foreach (var selItem in new ArrayList(treeView.SelectedItems)) { var e2 = new PreviewSelectionChangedEventArgs(false, selItem); OnPreviewSelectionChanged(e2); if (e2.CancelAll) { FocusHelper.Focus(item); lastShiftRoot = item.DataContext; return(false); } if (!e2.CancelThis) { treeView.SelectedItems.Remove(selItem); } } } var e = new PreviewSelectionChangedEventArgs(true, item.DataContext); OnPreviewSelectionChanged(e); if (e.CancelAny) { FocusHelper.Focus(item, true); lastShiftRoot = item.DataContext; return(false); } treeView.SelectedItems.Add(item.DataContext); lastShiftRoot = item.DataContext; } FocusHelper.Focus(item, true); return(true); }