nikotromus
nikotromus

Reputation: 1054

Can't get drag and drop events to fire

I have been pounding my head on a table today trying to get my drag and drop events to fire. The drag and drop functionality works on the interface, but the events wont fire. I need the events to fire so I can update the database with the new order of the objects. What am I doing wrong?

In the code below, I place break points in the 'Drop' and 'DragOver' methods, but they never get hit.

XAML:

<Window x:Class="Reorder_item_WPF.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525" 
         xmlns:dd="clr-namespace:GongSolutions.Wpf.DragDrop;assembly=GongSolutions.Wpf.DragDrop">
    <Grid>
        <ListBox Grid.Column="1" SelectionMode="Extended" ItemsSource="{Binding MSPCollection}" 
                 dd:DragDrop.IsDragSource="True" Width="300" Margin="0,0,5,0" dd:DragDrop.IsDropTarget="True">
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <Grid Background="#2ba3d5" Height="50" Width="280">
                        <TextBlock Text="{Binding Name}" Foreground="White" HorizontalAlignment="Center" VerticalAlignment="Center" FontSize="40"/>
                    </Grid>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>
    </Grid>
</Window>

c#:

public class MSP {
    public int Id { get; set; }
    public string Name { get; set; }        
}

class MainViewModel : IDropTarget
    {
        public ObservableCollection<MSP> MSPCollection { get; set; }

        public MainViewModel() {
            MSPCollection = new ObservableCollection<MSP>();

            MSPCollection.Add(new MSP() { 
                Id = 1,
                Name = "Anis Derbel"
            });

            MSPCollection.Add(new MSP()
            {
                Id = 2,
                Name = "Firas Mdimagh"
            });

            MSPCollection.Add(new MSP()
            {
                Id = 3,
                Name = "Khaled Jemni"
            });

            MSPCollection.Add(new MSP()
            {
                Id = 4,
                Name = "Sahbouch"
            });        
        }

        public void DragOver(IDropInfo dropInfo) {
            if (dropInfo.Data is MSP) {
                dropInfo.DropTargetAdorner = DropTargetAdorners.Highlight;
                dropInfo.Effects = DragDropEffects.Move;
            }
        }

        public void Drop(IDropInfo dropInfo) {
            MSP msp = (MSP)dropInfo.Data;
            ((IList)dropInfo.DragInfo.SourceCollection).Remove(msp);
        }
    }

Upvotes: 1

Views: 552

Answers (1)

MaSiMan
MaSiMan

Reputation: 690

You also need to set the DropHandler via the respective Attached Property:

<ListBox ItemsSource="{Binding Collection}"
     dd:DragDrop.IsDragSource="True"
     dd:DragDrop.IsDropTarget="True"
     dd:DragDrop.DropHandler="{Binding}" />

From documentation

Upvotes: 1

Related Questions