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.

Share:
11,045
asifabbas
Author by

asifabbas

Updated on June 04, 2022

Comments

  • asifabbas
    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
    asifabbas over 13 years
    Thanks 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
    Fredrik Hedblad over 13 years
    Ok, I missunderstood, thought you wanted to drag'n'drop from another control.
  • Fredrik Hedblad
    Fredrik Hedblad over 13 years
    Updated my example to rearrange list with drag and drop