Moving ListBoxItem Up/Down in WPF
11,045
If you don't want to implement something complex than the Move Up and Move Down can be handled like this. If the source looks like this
public ObservableCollection<FileClass> FileNames
{
get;
set;
}
private void moveUp_Click(object sender, RoutedEventArgs e)
{
FileClass selectedfile = listBox1.SelectedItem as FileClass;
int index = FileNames.IndexOf(selectedfile);
if (index > 0)
{
FileNames.Remove(selectedfile);
FileNames.Insert(index-1, selectedfile);
listBox1.SelectedItem = selectedfile;
}
}
private void moveDown_Click(object sender, RoutedEventArgs e)
{
FileClass selectedfile = listBox1.SelectedItem as FileClass;
int index = FileNames.IndexOf(selectedfile);
if (index < FileNames.Count-1)
{
FileNames.Remove(selectedfile);
FileNames.Insert(index + 1, selectedfile);
listBox1.SelectedItem = selectedfile;
}
}
CHANGE
Try this code to move items up and down with drag and drop within the ListBox
private void listBox1_Drop(object sender, DragEventArgs e)
{
ListBox parent = sender as ListBox;
FileClass data = e.Data.GetData(typeof(FileClass)) as FileClass;
FileClass objectToPlaceBefore = GetObjectDataFromPoint(parent, e.GetPosition(parent)) as FileClass;
if (data != null && objectToPlaceBefore != null)
{
int index = FileNames.IndexOf(objectToPlaceBefore);
FileNames.Remove(data);
FileNames.Insert(index, data);
listBox1.SelectedItem = data;
}
}
private void listBox1_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
ListBox parent = sender as ListBox;
FileClass data = GetObjectDataFromPoint(parent, e.GetPosition(parent)) as FileClass;
if (data != null)
{
DragDrop.DoDragDrop(parent, data, DragDropEffects.Move);
}
}
private static object GetObjectDataFromPoint(ListBox source, Point point)
{
UIElement element = source.InputHitTest(point) as UIElement;
if (element != null)
{
object data = DependencyProperty.UnsetValue;
while (data == DependencyProperty.UnsetValue)
{
data = source.ItemContainerGenerator.ItemFromContainer(element);
if (data == DependencyProperty.UnsetValue)
element = VisualTreeHelper.GetParent(element) as UIElement;
if (element == source)
return null;
}
if (data != DependencyProperty.UnsetValue)
return data;
}
return null;
}
That should complete the drag'n'drop.
Author by
asifabbas
Updated on June 04, 2022Comments
-
asifabbas almost 2 years
I've created a listbox which contain filenames. I want to give user a option to move up and down file name using up/down button and using drag and drop.
Anyone has an idea how to achieve this functionality.
XAML Code:
<ListBox Grid.Column="0" Name="listBox1" AllowDrop="True" Drop="listBox1_Drop" /> <StackPanel Grid.Column="1" HorizontalAlignment="Stretch" VerticalAlignment="Center"> <Button Name="moveUp" Content="Ç" FontFamily="Wingdings 3" Margin="3,3,3,3" Click="moveUp_Click" /> <Button Name="moveDown" FontFamily="Wingdings 3" Content="È" Margin="3,3,3,3" /> </StackPanel>
-
asifabbas over 13 yearsThanks for your answer. It work perfectly. For drag-and-drop, I'm still working because its on same ListBox, and as Button is using for Up and Down, user can arrange list using drag-and-drop.
-
Fredrik Hedblad over 13 yearsOk, I missunderstood, thought you wanted to drag'n'drop from another control.
-
Fredrik Hedblad over 13 yearsUpdated my example to rearrange list with drag and drop