/// <inheritdoc /> public override bool AcceptDrop(NSOutlineView outlineView, NSDraggingInfo info, NSObject item, nint index) { DebugDragDropPrint("***** OutlineView.AcceptDrop, index: " + index); var dropLocationTreeNode = item as NSTreeNode; bool acceptedDrop = dropLocationTreeNode != null; var viewModel = outlineView.GetInheritedValue <MenuLayoutViewModel>(IFakeDependencyObjectHelpers.DataContextPropertyName); IEnumerable <FileNodeViewModel> draggedItems = null; if (acceptedDrop) { var newParent = dropLocationTreeNode.GetRepresentedObject() as FolderViewModel; var pasteboard = info.DraggingPasteboard; acceptedDrop = newParent != null; if (acceptedDrop && pasteboard.CanReadItemWithDataConformingToTypes(MenuLayoutPasteboardDataTypeArray)) { draggedItems = DragDropHelpers.GetDataForType <IEnumerable <FileNodeViewModel> >(pasteboard, MenuLayoutPasteboardDataTypeArray); if (acceptedDrop) { acceptedDrop = newParent.ShouldAcceptDraggedItems(draggedItems.Select(draggedItem => draggedItem.Model)); } if (acceptedDrop) { var firstDraggedItem = draggedItems.First(); var parent = firstDraggedItem.Parent; var parentViewModel = viewModel.FindViewModelForModel(parent); if (parentViewModel == newParent) { var currentIndex = parent.IndexOfChild(firstDraggedItem.Model); if (currentIndex < index) { --index; } } acceptedDrop = newParent.MoveItems(viewModel, newParent, (int)index, draggedItems); } } else if (acceptedDrop && pasteboard.CanReadItemWithDataConformingToTypes(ProgramDescriptionPasteboardDataTypeArray)) { var droppedItems = DragDropHelpers.GetDataForType <IEnumerable <ProgramDescriptionViewModel> >(pasteboard, ProgramDescriptionPasteboardDataTypeArray).Select(draggedItem => draggedItem.Model); newParent.AddItems(viewModel, (int)index, droppedItems); } else { acceptedDrop = false; } DebugDragDropPrint("*** OutlineView drop into: " + newParent); } if (acceptedDrop) { TreeData.RearrangeObjects(); if ((draggedItems != null) && draggedItems.Any()) { viewModel.CurrentSelection = draggedItems.FirstOrDefault(i => i.Model != null); } } return(acceptedDrop); }