private static void OnOnDropCommandChanged( DependencyObject d, DependencyPropertyChangedEventArgs e )
        {
            var attached = DragDropManager.GetIsDropTargetAttached( d );
            if( !attached )
            {
                DragDropManager.SetIsDropTargetAttached( d, true );

                var ui = ( UIElement )d;

                ui.AllowDrop = true;
                var ctrl = ui as Control;
                if( ctrl != null )
                {
                    var bkg = ctrl.GetValue( ItemsControl.BackgroundProperty );
                    if( bkg == null )
                    {
                        ctrl.SetValue( ItemsControl.BackgroundProperty, Brushes.Transparent );
                    }
                }

                ui.DragEnter += ( s, args ) =>
                {
                    var os = ( DependencyObject )args.OriginalSource;
                    var command = DragDropManager.FindDragEnterCommand( os );
                    if( command != null )
                    {
                        var dropTarget = DragDropManager.FindDropTarget( os );
                        var cmdArgs = new DragEnterArgs(
                            args.Data,
                            args.KeyStates,
                            dropTarget,
                            args.AllowedEffects );

                        if( command.CanExecute( cmdArgs ) )
                        {
                            command.Execute( cmdArgs );
                        }
                    }
                };

                ui.DragLeave += ( s, args ) =>
                {
                    var os = ( DependencyObject )args.OriginalSource;
                    var command = DragDropManager.FindDragLeaveCommand( os );
                    if( command != null )
                    {
                        var dropTarget = DragDropManager.FindDropTarget( os );
                        var cmdArgs = new DragLeaveArgs(
                            args.Data,
                            args.KeyStates,
                            dropTarget,
                            args.AllowedEffects );

                        if( command.CanExecute( cmdArgs ) )
                        {
                            command.Execute( cmdArgs );
                        }
                    }
                };

                ui.DragOver += ( s, args ) =>
                {
                    var os = ( DependencyObject )args.OriginalSource;

                    var command = DragDropManager.FindDropCommand( os );
                    if( command != null )
                    {
                        var dropTarget = DragDropManager.FindDropTarget( os );

                        Point position = new Point( 0, 0 );
                        if( os is IInputElement )
                        {
                            position = args.GetPosition( ( IInputElement )os );
                        }

                        var cmdArgs = new DragOverArgs(
                            args.Data,
                            args.KeyStates,
                            dropTarget,
                            args.AllowedEffects,
                            position );

                        var result = command.CanExecute( cmdArgs );
                        if( !result )
                        {
                            args.Effects = cmdArgs.Effects;
                            args.Handled = true;
                        }
                    }
                    else
                    {
                        args.Effects = args.AllowedEffects;
                        args.Handled = true;
                    }
                };

                ui.Drop += ( s, args ) =>
                {
                    var os = ( DependencyObject )args.OriginalSource;

                    var command = DragDropManager.FindDropCommand( os );
                    if( command != null )
                    {
                        var dropTarget = DragDropManager.FindDropTarget( os );

                        Point position = new Point( 0, 0 );
                        if( os is IInputElement )
                        {
                            position = args.GetPosition( ( IInputElement )os );
                        }

                        var cmdArgs = new DropArgs( args.Data, args.KeyStates, dropTarget, position );
                        command.Execute( cmdArgs );
                    }
                };
            }
        }
        private static void OnOnDropCommandChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            var attached = DragDropManager.GetIsDropTargetAttached(d);

            if (!attached)
            {
                DragDropManager.SetIsDropTargetAttached(d, true);

                var ui = ( UIElement )d;

                ui.AllowDrop = true;
                var ctrl = ui as Control;
                if (ctrl != null)
                {
                    var bkg = ctrl.GetValue(ItemsControl.BackgroundProperty);
                    if (bkg == null)
                    {
                        ctrl.SetValue(ItemsControl.BackgroundProperty, Brushes.Transparent);
                    }
                }

                ui.DragEnter += (s, args) =>
                {
                    var os      = ( DependencyObject )args.OriginalSource;
                    var command = DragDropManager.FindDragEnterCommand(os);
                    if (command != null)
                    {
                        var dropTarget = DragDropManager.FindDropTarget(os);
                        var cmdArgs    = new DragEnterArgs(
                            args.Data,
                            args.KeyStates,
                            dropTarget,
                            args.AllowedEffects);

                        if (command.CanExecute(cmdArgs))
                        {
                            command.Execute(cmdArgs);
                        }
                    }
                };

                ui.DragLeave += (s, args) =>
                {
                    var os      = ( DependencyObject )args.OriginalSource;
                    var command = DragDropManager.FindDragLeaveCommand(os);
                    if (command != null)
                    {
                        var dropTarget = DragDropManager.FindDropTarget(os);
                        var cmdArgs    = new DragLeaveArgs(
                            args.Data,
                            args.KeyStates,
                            dropTarget,
                            args.AllowedEffects);

                        if (command.CanExecute(cmdArgs))
                        {
                            command.Execute(cmdArgs);
                        }
                    }
                };

                ui.DragOver += (s, args) =>
                {
                    var os = ( DependencyObject )args.OriginalSource;

                    var command = DragDropManager.FindDropCommand(os);
                    if (command != null)
                    {
                        var dropTarget = DragDropManager.FindDropTarget(os);

                        Point position = new Point(0, 0);
                        if (os is IInputElement)
                        {
                            position = args.GetPosition(( IInputElement )os);
                        }

                        var cmdArgs = new DragOverArgs(
                            args.Data,
                            args.KeyStates,
                            dropTarget,
                            args.AllowedEffects,
                            position);

                        var result = command.CanExecute(cmdArgs);
                        if (!result)
                        {
                            args.Effects = cmdArgs.Effects;
                            args.Handled = true;
                        }
                    }
                    else
                    {
                        args.Effects = args.AllowedEffects;
                        args.Handled = true;
                    }
                };

                ui.Drop += (s, args) =>
                {
                    var os = ( DependencyObject )args.OriginalSource;

                    var command = DragDropManager.FindDropCommand(os);
                    if (command != null)
                    {
                        var dropTarget = DragDropManager.FindDropTarget(os);

                        Point position = new Point(0, 0);
                        if (os is IInputElement)
                        {
                            position = args.GetPosition(( IInputElement )os);
                        }

                        var cmdArgs = new DropArgs(args.Data, args.KeyStates, dropTarget, position);
                        command.Execute(cmdArgs);
                    }
                };
            }
        }