Я сделал нечто похожее на этот в прошлом году (.NET .3.5).
Если я правильно помню, когда вы «отбрасываете» объект, который был выделен и перетащен (через слой «adorner»), вы по сути держите ссылку на выбранный объект. Когда этот объект «отброшен», обработчик события «InstanceDroppedOnUserControlFoo_Handler (... args)» имеет нетипизированную ссылку на удаленный объект.
Из этого вы можете разыграть (если тип известен) и получить доступ к полю Id для вашего сердца.
Вопрос теперь заключается в том, использует ли целевой пользовательский элемент управления для перетаскивания ту же ViewModel в своем DataContext, что и в Drag Source? Как и в большинстве случаев, когда это не так, вы не получите ссылку в аргументах события, вы получите ноль.
Если это так, вам необходимо изучить следующие варианты взаимодействия между ViewModel:
Использовать инфраструктуру передачи сообщений MVVM ( MVVM Light Framework см. Компонент Messenger )
или же
Составные события Pub Sub через WPF Prism - EventAggregator :
Затем выполните этот процесс (или что-то более приспособленное к вашим потребностям):
- Когда элемент выбран и перетаскивается, удерживайте его ссылку в свойстве ViewModel вашего Drag Source.
- Когда элемент опущен, опубликуйте сообщение с надписью «Я хочу ссылку на выбранный элемент, который перетаскивался».
- Источник перетаскивания может опубликовать сообщение в ответ со ссылкой на перетаскиваемый объект, который будет получен запрашивающей моделью представления.
Очевидно, что на этом этапе вы можете адаптировать справочную информацию к вашим потребностям. Я оставлю вас с одним последним предложением, возможно, стоит подумать об использовании класса контроллера, который управляет этим видом операций. Я видел контроллер, используемый Microsoft Patterns & Practices в координации с MVVM в образцах WPF CAG (PRISM) , так что это не случайно.