public static void IsDragSelectingEnabledPropertyChanged(DependencyObject o, DependencyPropertyChangedEventArgs e)
        {
            ListView listView = o as ListView;

            bool isDragSelectionEnabled = DragSelectionHelper.GetIsDragSelectionEnabled(listView);

            // if DragSelection is enabled
            if (isDragSelectionEnabled)
            {
                // set the listbox's selection mode to multiple ( didn't work with extended )
                listView.SelectionMode = SelectionMode.Multiple;

                // set the static listbox property
                DragSelectionHelper.ListView = listView;

                // and subscribe to the required events to handle the drag selection and the attached properties
                listView.PreviewMouseLeftButtonDown  += new MouseButtonEventHandler(DragSelectionHelper.listBox_PreviewMouseLeftButtonDown);
                listView.PreviewMouseRightButtonDown += new MouseButtonEventHandler(listBox_PreviewMouseRightButtonDown);
                listView.MouseLeftButtonUp           += new MouseButtonEventHandler(DragSelectionHelper.listBox_MouseLeftButtonUp);
            }
            else // is selection is disabled
            {
                // set selection mode to the default
                listView.SelectionMode = SelectionMode.Single;

                // dereference the listbox
                DragSelectionHelper.ListView = null;

                // unsuscribe from the events
                listView.PreviewMouseLeftButtonDown  -= new MouseButtonEventHandler(DragSelectionHelper.listBox_PreviewMouseLeftButtonDown);
                listView.PreviewMouseRightButtonDown -= new MouseButtonEventHandler(DragSelectionHelper.listBox_PreviewMouseRightButtonDown);
                listView.MouseLeftButtonUp           -= new MouseButtonEventHandler(DragSelectionHelper.listBox_MouseLeftButtonUp);
            }
        }
        public static void IsDragClickStartedPropertyChanged(DependencyObject o, DependencyPropertyChangedEventArgs e)
        {
            bool isDragClickStarted = DragSelectionHelper.GetIsDragClickStarted(DragSelectionHelper.ListView);

            // if click has been drag click has started, clear the current selected items and start drag selection operation again
            if (isDragClickStarted)
            {
                DragSelectionHelper.ListView.SelectedItems.Clear();
            }
        }
        public static void IsDragSelectingPropertyChanged(DependencyObject o, DependencyPropertyChangedEventArgs e)
        {
            ListViewItem item = o as ListViewItem;

            bool clickInitiated = DragSelectionHelper.GetIsDragClickStarted(DragSelectionHelper.ListView);

            // this is where the item.Parent was null, it was supposed to be the ListBox, I guess it's null because items are not
            // really ListBoxItems but are wells
            if (clickInitiated)
            {
                bool isDragSelecting = DragSelectionHelper.GetIsDragSelecting(item);

                if (isDragSelecting)
                {
                    // using the ListBox static reference because could not get to it through the item.Parent property
                    DragSelectionHelper.ListView.SelectedItems.Add(item);
                }
            }
        }
 private static void listBox_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
 {
     // notify the helper class that the list box has terminated the drag click
     DragSelectionHelper.SetIsDragClickStarted(DragSelectionHelper.ListView, false);
 }
 private static void listBox_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
 {
     // notify the helper class that the listbox has initiated the drag click
     DragSelectionHelper.SetIsDragClickStarted(DragSelectionHelper.ListView, true);
 }