/// <summary>
 /// Adds a tree view item to the multi-selection without going through
 /// the normal event chain. Used only by TreeViewItemMultiSelect.
 /// </summary>
 /// <param name="newItem"></param>
 internal void AddTreeViewItemToSelection(TreeViewItemMultiSelect newItem)
 {
     if (!selectedTreeViewItems.Contains(newItem))
     {
         selectedTreeViewItems.Add(newItem);
     }
     previousItem = newItem;
 }
 /// <summary>
 /// Removes the item passed in to from the selected items
 /// </summary>
 /// <param name="userItemToDeselect"></param>
 public void DeselectItem(object itemToDeselect)
 {
     if (itemToTreeViewItem.ContainsKey(itemToDeselect))
     {
         TreeViewItemMultiSelect treeViewItem = itemToTreeViewItem[itemToDeselect];
         treeViewItem.IsSelected = false;
         if (selectedTreeViewItems.Contains(treeViewItem))
         {
             selectedTreeViewItems.Remove(treeViewItem);
         }
     }
 }
        /// <summary>
        /// Handles when the selected item changes. Handles the multi-select functionality.
        /// </summary>
        /// <param name="e"></param>
        protected override void OnSelectedItemChanged(RoutedPropertyChangedEventArgs <object> e)
        {
            TreeViewItemMultiSelect newItem = (TreeViewItemMultiSelect)typeof(TreeView).GetField("_selectedContainer", BindingFlags.NonPublic | BindingFlags.Instance).GetValue((TreeView)this);

            // Turn off updating from TreeViewItems
            isSelectionChangeActiveProperty.SetValue((TreeView)this, true, null);
            if ((Keyboard.Modifiers & ModifierKeys.Control) == ModifierKeys.Control)
            {
                // We are either :
                // a ) Adding a new item so newItem!=null & !selectedTreeViewItems.Contains(newItem)
                // b ) Removing the last selection so newItem==null;
                // c ) Removing a previous selection selectedTreeViewItems.Contains(newItem)


                if (newItem != null && !selectedTreeViewItems.Contains(newItem))
                {
                    // Adding a new item
                    if (previousItem != null)
                    {
                        previousItem.IsSelected = true;
                    }
                    selectedTreeViewItems.Add(newItem);
                    previousItem = newItem;
                }
                else if (newItem == null && previousItem != null)
                {
                    // Removing the last selected item

                    selectedTreeViewItems.Remove(previousItem);
                    previousItem = null;
                }
                else if (selectedTreeViewItems.Contains(newItem))
                {
                    // Removing a previously selected item

                    newItem.IsSelected = false;
                    selectedTreeViewItems.Remove(newItem);

                    // The selection needs to be put back on the last selected item
                    if (previousItem != null)
                    {
                        previousItem.IsSelected = true;
                    }
                    previousItem = null;
                }
            }
            else
            {
                while (selectedTreeViewItems.Count > 0)
                {
                    TreeViewItemMultiSelect firstItem = selectedTreeViewItems[0];
                    if (firstItem.IsSelected && firstItem != newItem)
                    {
                        firstItem.IsSelected = false;
                    }
                    selectedTreeViewItems.RemoveAt(0);
                }
                if (newItem != null)
                {
                    selectedTreeViewItems.Add(newItem);
                }

                previousItem = newItem;
            }
            // Turn back on updating from TreeViewItems
            isSelectionChangeActiveProperty.SetValue((TreeView)this, false, null);

            // when the newItem is null that's when the last item was deselected.
            base.OnSelectedItemChanged(e);
        }