/// <summary>
        /// Drop started
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        void PreviewDrop(object sender, DragEventArgs e)
        {
            var itemsControl = (ItemsControl)sender;

            this.DestroyAdorners();
            e.Handled = true;
            if (e.Data.GetDataPresent(this.ItemTypeKey))
            {
                int index = FindInsertionIndex(itemsControl, e);

                DragInfo data = e.Data.GetData(this.ItemTypeKey) as DragInfo;
                if (data != null && (!data.AllowOnlySelf || itemsControl == data.Source))
                {
                    var allowedEffects = e.AllowedEffects;
                    if (this.DropInitiated != null)
                    {
                        DragDropEventArgs de = new DragDropEventArgs(data.Source, itemsControl, data.Data, index)
                        {
                            AllowedEffects = allowedEffects
                        };
                        this.DropInitiated(this, de);
                        allowedEffects = de.AllowedEffects;
                        if (de.Cancel)
                        {
                            e.Effects = DragDropEffects.None;
                            return;
                        }
                    }

                    object itemToAdd = data.Data;
                    e.Effects = GetDropEffectType(allowedEffects, e.KeyStates);

                    if (DragUtilities.DoesItemExists(itemsControl, itemToAdd) &&
                        (e.Effects == DragDropEffects.Move ||
                         (e.Effects & DragDropEffects.Move) > 0 && (e.KeyStates & DragDropKeyStates.ControlKey) > 0))
                    {
                        DragUtilities.RemoveItem(itemsControl, itemToAdd);
                        // Recalc our position based on the removal
                        index = FindInsertionIndex(itemsControl, e);
                    }

                    DragUtilities.AddItem(itemsControl, itemToAdd, index);
                    DragUtilities.SelectItem(itemsControl, index);
                }
                else
                {
                    e.Effects = DragDropEffects.None;
                }
            }
            else
            {
                e.Effects = DragDropEffects.None;
            }
        }
        /// <summary>
        /// This starts the drag operation from the given ItemsControl
        /// </summary>
        /// <param name="itemsControl"></param>
        private void DragStarted(ItemsControl itemsControl)
        {
            DragDropEffects allowedEffects = DragDropEffects.Copy | DragDropEffects.Move;

            if (this.DragInitiated != null)
            {
                var dde = new DragDropEventArgs(itemsControl, null, this._data)
                {
                    AllowedEffects = allowedEffects
                };
                this.DragInitiated(this, dde);
                if (dde.Cancel)
                {
                    this.ResetState();
                    return;
                }
                allowedEffects = dde.AllowedEffects;
            }

            UIElement draggedItemContainer = DragUtilities.GetItemContainerFromPoint(itemsControl, this._dragStartPosition);

            this._isDragging = true;

            DataObject dObject = new DataObject(this.ItemTypeKey, new DragInfo {
                Data = this._data, Source = itemsControl, AllowOnlySelf = this.AllowOnlySelf
            });
            DragDropEffects e = DragDrop.DoDragDrop(itemsControl, dObject, allowedEffects);

            if ((e & DragDropEffects.Move) != 0)
            {
                if (draggedItemContainer != null)
                {
                    int dragItemIndex = itemsControl.ItemContainerGenerator.IndexFromContainer(draggedItemContainer);
                    DragUtilities.RemoveItem(itemsControl, dragItemIndex);
                }
                else
                {
                    DragUtilities.RemoveItem(itemsControl, this._data);
                }
            }

            this.ResetState();
        }