2015-01-13 70 views
0

我有以下XAML代碼:如何檢索被放置的元素?

<ListBox x:Name="ListBox1" 
     ItemsSource="{Binding UserBase}" 
     SelectedItem="{Binding User}" 
     SelectionMode="Single" 
     AllowDrop="True" 
     myOwnDragDrop:DragDropSource="{Binding}" 
     myOwnDragDrop:DragDropTarget="{Binding}"> 
    <ListBox.ItemTemplate> 
     <DataTemplate> 
      <TextBlock Text="{Binding Name}" AllowDrop="True" /> 
     </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 

<ListBox x:Name="ListBox2" 
     ItemsSource="{Binding UserBase}" 
     SelectedItem="{Binding User}" 
     SelectionMode="Single" 
     myOwnDragDrop:Source="{Binding}" 
     myOwnDragDrop:Target="{Binding}"> 
    <ListBox.ItemTemplate> 
     <DataTemplate> 
      <TextBlock Text="{Binding Name}" AllowDrop="True" /> 
     </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 

因此,這實際上是在我的MVVM執行工作(至少拖放部分)。的問題是,在兩個相關屬性的接口只給我:

public void Drop(object data) 

在哪裏的數據實際上是在其中駐留ListBox1中的整個視圖對象。理論上沒有問題,但我想知道如何獲得正確的用戶,而不需要對接口或相關屬性實現進行任何更改?

請注意依賴屬性似乎是處理事件private static void Drop(object sender, DragEventArgs e),但我無法訪問e

如果這是完全不可能的,是否有可能從DragEventArgs中檢索被拖放的用戶?

謝謝你的一切!

回答

0

首先:你看過GongSolutions WPF DragDrop庫嗎?

它是免費的,並且可以在NuGet上使用,並且使得在WPF中實現拖放變得容易很多,但仍然保留對流程的完全控制權。

特別是,Drop()方法公開了一個IDropInfo對象,它允許您訪問有關拖放過程(包括源和目標UIElements)的各種信息。

我花了相當多的時間嘗試從頭開始拖放,但發現這個庫更容易實現,它允許我將所有拖放功能添加到ViewModel,而不是我的代碼隱藏。

在GitHub頁面上有一些很好的入門文檔。

其次,關於你如何獲得拖動滴到用戶(不使用上述庫):

當我實現列表框的拖/放,我發現我需要啓用和處理的AllowDrop在每個ListItem。您可能想嘗試爲列表框創建自定義的ItemPanelTemplate,並在面板上啓用AllowDrop。這樣,您將收到的'對象數據'應該是ListItemPanel,您可以從中訪問DataContext以獲取用戶。

+0

我不知道我是否正確解釋了自己,或者我不明白你的第二個解釋。假設我將user1拖到user2上,我想獲得一個指向user2的指針。在你的情況下,我會得到user1還是我錯了?我感興趣的是當我將user1放到它上面時被擠壓的對象。 – Snowflake

+0

@Snowflake你能給我一些關於你的實現的更多信息嗎? Drop()方法在哪裏?它怎麼叫?什麼是myOwnDragDrop:... **附加屬性? – olitee