/// <summary>
        /// Finds the drag container that is the WPF element
        /// that holds the DataObject that will be dragged.
        /// </summary>
        /// <param name="originalSource">
        /// The original source where the
        /// drag operation started.
        /// </param>
        /// <returns>
        /// The element that holds the DataObject,
        /// or null if none can be found.
        /// </returns>
        static DependencyObject FindDragContainer(DependencyObject originalSource)
        {
            var element = originalSource.FindParent <DependencyObject>(t =>
            {
                return(DragDropManager.GetDataObject(t) != null);
            });

            return(element);
        }
        static void StartDrag(DependencyObject d, MouseEventArgs e)
        {
            var sourceItem = DragDropManager.FindDragContainer(( DependencyObject )e.OriginalSource);

            DragDropManager.SetIsDragging(d, true);

            var obj     = DragDropManager.GetDataObject(sourceItem);
            var objType = DragDropManager.GetDataObjectType(sourceItem);

            DataObject data = null;

            if (String.IsNullOrEmpty(objType))
            {
                data = new DataObject(obj.GetType(), obj);
            }
            else
            {
                data = new DataObject(objType, obj);
            }

            var de = DragDrop.DoDragDrop(d, data, DragDropEffects.Move);

            DragDropManager.SetIsDragging(d, false);
        }