Посмотрите как реализован Drag&Drop в стандратных библиотеках.
Есть централизованный менеджер DnD. В нем регистрируются все источники и получатели DnD. Когда окно иницирует DnD процесс, оно создает некоторую абстракцию (Transfer). Менеджер при перетаскивании объекта на какой-либо приемник, спрашивает приемник: "готов ли ты принять этот Transfer". Если приемник готов, отдает ему эту абстракцию.