Mi sono trovato a dover implementare il Drag and Drop tra l'item di una ListView e uno degli item di una ListBox, ma la documentazione in merito è parecchio scarsa...
Si trovano più che altro esempi di come "draggare" un file dentro la propria applicazione o come spostare una figura da un lato all'altro di un Canvas...
DragDrop.DoDragDrop di per sè permette di passare i dati dell'oggetto del trasferimento.
La facilità dell'implementazione sta nel fatto che è sufficiente impostare a true la proprietà AllowDrop del controllo target (la mia ListBox)
dichiarare l'Event Handler MouseMove sul controllo source (la mia ListView) nel codice XAML
e gestirla lato code behind
L'uso del MouseButtonState.Pressed mi evita di dover intercettare l'evento PreviewMouseButtonDown e l'equivalente Up per impostare n variabili booleane (tipo m_IsDown, m_IsDragging, ecc.). Ovviamente questa soluzione non è esaustiva: un eventuale scorrimento delle scrollbar della ListView, in caso di elemento selzionato, verrebbe interpretato come Drag e non otterrebbe l'effetto di scorrimento desiderato; la cosa si potrebbe ovviare "innestando" la MyListView in un controllo Scroller disabilitando lo scrolling automatico della ListView stessa...
Nell'EventHandler del Drop dovrei identificare l'item sul quale sto "droppando" (questo lo vediamo un'altra volta ) potrei ottenere dal DragEventArgs tramite Data.GetData l'oggetto che ho passato tramite DoDragDrop (il secondo parametro) e che mi verrebbe restituito come IDataObject; nel mio caso sono stato più fortunato: ListView.SelectedItem restituisce direttamente l'oggetto "bindato" al ListViewItem.
Parecchie delle cose che ho elencato (e che magari ho dato per scontato nel codice presentato) derivano dal fatto che source e target del Drag and Drop risiedono nella stessa Window e quindi la Window conosce entrambi. In caso contrario l'IDataObject conterrebbe i dati draggati