我有以下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 :(得分:0)
首先:你看过GongSolutions WPF DragDrop图书馆吗?
它是免费的,并且可以在NuGet上使用,并且可以更轻松地在WPF中实现拖放操作,但仍然可以完全控制该过程。
特别是,Drop()方法公开了一个IDropInfo对象,它允许您访问有关拖放过程的各种信息(包括源和目标UIElements)。
我花了很多时间尝试从头开始实现拖放,但发现这个库更容易实现,它允许我将所有拖放功能添加到我的ViewModel而不是我的代码隐藏
GitHub页面上有一些很好的入门文档。
其次,关于如何获得用户拖拽的拖拽(不使用上述库):
当我在列表框之间实现拖放时,我发现我需要在每个ListItem 上启用和处理AllowDrop。您可能想尝试为列表框创建自定义ItemPanelTemplate,并在面板上启用AllowDrop。这样,您将收到的“对象数据”应该是ListItemPanel,您可以从中访问DataContext以获取用户。