Currently, ContentDragBehavior will forward only the binded Context into the drag+drop interaction. IDragHandler.BeforeDragDrop does not seem to allow for a produced value to be specified as the drag+drop payload.
Use case: I have an image editor where I make selections and drag+drop to replace contents. There is no backing collection and as such it doesn't work like a collection control. The source Context is the VM because there is logic that I want to run before drag initiated.
I want to produce the payload (an object with copied image data and/or tile metadata) at drag initiation because it's expensive to repeatedly create during selection. I also want the drag+drop interaction to "own" the payload at that point so that the source VM doesn't need to. I have already done this locally by extending IDragHandler and creating a modified ContextDragBehavior, though this is probably not an appropriate API for the library if you can break IDragHandler.BeforeDragDrop.
My local changes:
public interface IDragHandlerEx : IDragHandler
{
public object? Payload { get; set; }
}
I have modified ContextDragBehavior to use IDragHandlerEx and this area of ContextDragBehavior to:
var context = Context ?? AssociatedObject?.DataContext;
Handler?.BeforeDragDrop(sender, _triggerEvent, context);
var payload = Handler?.Payload ?? context;
await DoDragDrop(_triggerEvent, payload);
Handler?.AfterDragDrop(sender, _triggerEvent, context); // This may need payload as an extra parameter
Currently,
ContentDragBehavior
will forward only the bindedContext
into the drag+drop interaction.IDragHandler.BeforeDragDrop
does not seem to allow for a produced value to be specified as the drag+drop payload.Use case: I have an image editor where I make selections and drag+drop to replace contents. There is no backing collection and as such it doesn't work like a collection control. The source
Context
is the VM because there is logic that I want to run before drag initiated.I want to produce the payload (an object with copied image data and/or tile metadata) at drag initiation because it's expensive to repeatedly create during selection. I also want the drag+drop interaction to "own" the payload at that point so that the source VM doesn't need to. I have already done this locally by extending
IDragHandler
and creating a modifiedContextDragBehavior
, though this is probably not an appropriate API for the library if you can breakIDragHandler.BeforeDragDrop
.My local changes:
I have modified
ContextDragBehavior
to useIDragHandlerEx
and this area of ContextDragBehavior to: