コード例 #1
0
            /// <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);
            }