Обработка DataObject не имеет отношения к иерархиям классов - это прямой тип 'string', полученный из полного имени данного типа данных, поэтому у него нет контекста, который предоставил бы ему знание подклассов. Я только что столкнулся с точно такой же проблемой, реализуя перетаскивание в виде дерева.
У меня было два варианта (это, возможно, перетаскивание и привязка - если это не ваша проблема, это может быть не очень полезно) - оба полагаются на изменение источника объекта данных (опять же, если вы не не имеет доступа к этому, это может быть не очень полезно).
Создайте класс-оболочку, который принимает экземпляр ItemType
, и при вызове DoDragDrop
передайте эту оболочку вместо фактического экземпляра. С другой стороны, вместо этого проверьте DataObject.GetData(typeof(WrapperClass))
.
Опять же, где устанавливается объект данных, установите экземпляр DataObject самостоятельно, например. Звоните
ctl.DoDragDrop(new DataObject(typeof(ItemType).FullName, itemTypeInstance),
DragDropEffects.Move|DragDropEffects.Copy)
тогда вы можете просто использовать DataObject.GetData(typeof(ItemType))
на другой стороне.