/// <summary>
        /// Initializes a new instance of the DragOperation class.
        /// </summary>
        /// <param name="dragSource">The source of the drag operation.</param>
        /// <param name="data">The data associated with the drag operation.
        /// </param>
        /// <param name="allowedEffects">The allowed effects of the drag
        /// operation.
        /// </param>
        /// <param name="initialKeyState">The initial state of the keys relevant
        /// to drag operations.</param>
        public DragOperation(DependencyObject dragSource, object data, SW.DragDropEffects allowedEffects, SW.DragDropKeyStates initialKeyState)
        {
            SW.IDataObject dataObject = data as SW.IDataObject;
            if (dataObject == null)
            {
                dataObject = new DataObject(data);
            }

            _allowedEffects = allowedEffects;
            KeyStates       = initialKeyState;

            _dragSource = dragSource;
            SW.DragEventArgs dragStartEventArgs =
                new SW.DragEventArgs()
            {
                OriginalSource = dragSource,
                AllowedEffects = allowedEffects,
                Effects        = allowedEffects,
                Data           = dataObject
            };

            _lastDragEventArgs = dragStartEventArgs;
            dragStartEventArgs.AllowedEffects = allowedEffects;
            dragStartEventArgs.Data           = dataObject;

            this._dragStartEventArgs = dragStartEventArgs;

            IObservable <Event <SW.QueryContinueDragEventArgs> > sourceQueryContinue =
                from dragStartedEvent in _dragStarting
                from queryContinueDragEvent in _dragSourceQueryContinueDrag.Until(_dragCompleted)
                where queryContinueDragEvent.EventArgs.Handled
                select queryContinueDragEvent;

            sourceQueryContinue
            .Where(queryContinueDragEvent => queryContinueDragEvent.EventArgs.Action == SW.DragAction.Drop)
            .Subscribe(queryContinueDragEvent => OnTargetDrop());

            sourceQueryContinue
            .Where(queryContinueDragEvent => queryContinueDragEvent.EventArgs.Action == SW.DragAction.Cancel)
            .Subscribe(queryContinueDragEvent => OnCancel());

            _dragCompleted.Subscribe(_ => IsDragging = false);
        }
 /// <summary>
 /// Retrieves the data based using the first acceptable format.
 /// </summary>
 /// <param name="that">The data object.</param>
 /// <returns>The data retrieved from the data object.</returns>
 public static object GetData(this SW.IDataObject that)
 {
     return(that.GetData(that.GetFormats()[0]));
 }