WPF - 从DataTemplate中拖动

时间:2009-05-29 00:00:57

标签: wpf drag-and-drop listbox datatemplate

我有一个ListBox,显示员工使用DataTemplate - 它看起来非常类似于this screenshot。我希望能够点击员工照片,拖动它并将其放在ListBox之外的某个地方。我怎样才能做到这一点?我不知道如何捕获Image的PreviewMouseLeftButtonDown事件,因为它在DataTemplate中。

编辑:DataTemplate位于单独的程序集中,拖放逻辑需要位于具有ListBox的Window中。

Edit2:我认为这样做的正确方法是使用命令,我是对的吗?

谢谢!

2 个答案:

答案 0 :(得分:2)

您没有提到数据模板的位置。我将尝试涵盖两种非常相似的可能性。

如果您在用户控件的资源中有datatemplate,则可以在代码隐藏文件中为用户控件设置事件。

<UserControl.Resources>
    <DataTemplate DataType="{x:Type local:Staff}">
      <StackPanel>
        <TextBlock Text="{Binding Path=Name}"/>
        <Image Name="staffImage" PreviewMouseLeftButtonDown="staffImage_PreviewMouseLeftButtonDown"/>
      </StackPanel>
    </DataTemplate>
</UserControl.Resources>

然后在UserControl.cs

private void staffImage_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{

}

现在,如果您在资源字典中使用datetemplate,那么您可以执行完全相同的操作,但您需要为资源字典创建一个代码隐藏文件。 See here

对于拖放演练本身......请参阅Jamie Rodriguez发表here

希望有所帮助。

答案 1 :(得分:1)

您只需将ElementDragBehavior(类似的东西)添加到数据模板即可。

另一个选项(我不确定它是否存在于WPF中,但它确实存在于Silverlight中) 在silverlight工具包中,您可以在ListBox上方添加:

<toolkit:ListBoxDragDropTarget AllowDrop="True">

这使得列表中的每个项目都可以拖动到具有该

的其他ListBox中