private void lv_Input_MouseMove(object sender, System.Windows.Input.MouseEventArgs e) { // Get the current mouse position Point mousePos = e.GetPosition(null); Vector diff = startPoint - mousePos; if (e.LeftButton == MouseButtonState.Pressed && (Math.Abs(diff.X) > SystemParameters.MinimumHorizontalDragDistance || Math.Abs(diff.Y) > SystemParameters.MinimumVerticalDragDistance)) { // Get the dragged ListViewItem ListView listView = sender as ListView; ListViewItem listViewItem = FindAnchestor <ListViewItem>((DependencyObject)e.OriginalSource); if (listViewItem == null) { return; // Abort } // Find the data behind the ListViewItem Models.FileObject item = (Models.FileObject)listView.ItemContainerGenerator.ItemFromContainer(listViewItem); if (item == null) { return; // Abort } // Initialize the drag & drop operation startIndex = listView.SelectedIndex; DataObject dragData = new DataObject("FileObject", item); DragDrop.DoDragDrop(listViewItem, dragData, DragDropEffects.Copy | DragDropEffects.Move); } }
private void lv_Input_Drop(object sender, DragEventArgs e) { int index = -1; if (e.Data.GetDataPresent("FileObject") && sender == e.Source) { // Get the drop ListViewItem destination ListView listView = sender as ListView; ListViewItem listViewItem = FindAnchestor <ListViewItem>((DependencyObject)e.OriginalSource); if (listViewItem == null) { // Abort e.Effects = DragDropEffects.None; return; } // Find the data behind the ListViewItem Models.FileObject item = (Models.FileObject)listView.ItemContainerGenerator.ItemFromContainer(listViewItem); // Move item into observable collection // (this will be automatically reflected to lstView.ItemsSource) e.Effects = DragDropEffects.Move; index = viewModel.Files.IndexOf(item); if (startIndex >= 0 && index >= 0) { viewModel.Files.Move(startIndex, index); } startIndex = -1; // Done! viewModel.RefreshFileNums(); } }