Drag and Drop with ListBox

I have a simple implementation ListViewin WPF that allows me to select multiple items in a list by holding the mouse button and dragging items. However, holding down the mouse button when I move the mouse out ListView, something strange happens with the selection. Ideally, I would just want the selection to remain the same, but instead, it quickly iterates over all the selected items, leaving only the last selected item.

Here is the code, have any ideas?

public class MultiSelectListView : ListView
{
   private bool m_isSelectionActive;

   public bool IsSelectionActive
   {
      get { return m_isSelectionActive; }
   }

   protected override DependencyObject GetContainerForItemOverride()
   {
      return new MultiSelectListViewItem(this);
   }

   protected override void OnPreviewMouseLeftButtonDown(MouseButtonEventArgs e)
   {
      m_isSelectionActive = true;
   }

   protected override void OnPreviewMouseLeftButtonUp(MouseButtonEventArgs e)
   {
      m_isSelectionActive = false;
   }
}

public class MultiSelectListViewItem : ListViewItem
{
   private readonly MultiSelectListView m_parent;

   public MultiSelectListViewItem(MultiSelectListView parent)
   {
      m_parent = parent;
   }

   protected override void OnMouseEnter(System.Windows.Input.MouseEventArgs e)
   {
      if (m_parent.IsSelectionActive)
         IsSelected = true;
   }
}
+5
source share
1 answer

, , , "" . , , , , Multiple. , MultiSelectListView , Multiple , . - , SelectionMode Extended Single XAML.

public class MultiSelectListView : ListView
{
    private bool m_isSelectionActive;
    public bool IsSelectionActive
    {
        get
        {
            return m_isSelectionActive;
        }
    }
    protected override DependencyObject GetContainerForItemOverride()
    {
        return new MultiSelectListViewItem(this);
    }
    protected override void OnPreviewMouseLeftButtonDown(MouseButtonEventArgs e)
    {
        if (SelectionMode != SelectionMode.Single)
        {
            SelectedItems.Clear();
        }
        m_isSelectionActive = true;
    }
    protected override void OnPreviewMouseLeftButtonUp(MouseButtonEventArgs e)
    {
        m_isSelectionActive = false;
    }
    public MultiSelectListView() : base()
    {
        SelectionMode = SelectionMode.Multiple;
    }
}
+3

All Articles