![]() |
Platforms, Frameworks & Libraries »
Windows Presentation Foundation »
General
Intermediate
License: The Code Project Open License (CPOL)
MultiSelect Drag and Drop in WPFBy Nick PolyakDiscusses implementation of Drag and Drop functionality for multiselected items in ListBox/ListView |
C# (C# 3.0), Windows, .NET (.NET 3.0, .NET 3.5), XAML, WPF, Dev
|
|
Advanced Search Add to IE Search |
|
|
|
||||||||||||||||
This article is a variation on the previous theme: Drag and Drop (see Very simple WPF Drag and Drop Sample without Win32 calls). Here, drag and drop of multiple items selected within WPF ListView or ListBox is discussed.
To run the sample, open it in Visual Studio 2008. Then simply compile and run the application.
Several points on using the sample:
Here are some code excerpts. In function ListView1_PreviewMouseLeftButtonDown called in the beginning of the drag operation, we create a set of selected items (Dictionary with null values) and pass it to the DragDrop.DoDragDrop(...) function as data item:
Dictionary shapes = new Dictionary();
if (ListView1.SelectedItems.Count == 0)
return;
foreach(Shape shape in ListView1.SelectedItems)
{
shapes[shape] = null;
}
Shape currentShape = ListView1.Items[index] as Shape;
// we do not initiate drag if the mouse descended on
// a non-selected item during the beginning of drag
if (!shapes.ContainsKey(currentShape))
return;
DragDrop.DoDragDrop(this.ListView1, shapes, allowedEffects);
Function ListView1_Drop (the one implementing the drop operation) is slightly more complicated. First we record the list item into which the selected items are dropped:
int index = this.GetCurrentIndex(e.GetPosition);
...
Shape dropTargetShape = myShapes[index];
Then we build a list of selected items to be dropped:
List dropList = new List();
foreach(Shape shape in myShapes)
{
if (!selectedShapes.ContainsKey(shape))
continue;
dropList.Add(shape);
}
We need this step in order to ensure that the dropped items are in the same order as they were originally. (In ListView.SelectedItems collection, the items are stored in the order in which they are selected, not in the order in which they are in the ListView).
Then we remove all the selected items from the collection myShapes (which is the collection of ListView items):
foreach(Shape shape in dropList)
{
myShapes.Remove(shape);
}
Then we get the (possibly) new index of the drop target item within the modified collection:
// find index of the drop target item after the removal
// of the items to be dropped
int selectIndex = myShapes.IndexOf(dropTargetShape);
Finally we insert the items into the collection before the drop target item:
for(int i = 0; i < dropList.Count; i++)
{
Shape shape = dropList[i];
myShapes.Insert(i + selectIndex, shape);
...
}
| You must Sign In to use this message board. | ||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||
General
News
Question
Answer
Joke
Rant
Admin
|
PermaLink |
Privacy |
Terms of Use
Last Updated: 6 Mar 2008 Editor: Deeksha Shenoy |
Copyright 2008 by Nick Polyak Everything else Copyright © CodeProject, 1999-2009 Web21 | Advertise on the Code Project |