using System.Windows;
using System.Windows.Input;
namespace TestLauncher.Tools
{
internal class DragDropHelper
{
public static readonly DependencyProperty DropCommandProperty;
static DragDropHelper()
{
//Drop
DropCommandProperty = DependencyProperty.RegisterAttached("DropCommand",
typeof(ICommand),
typeof(DragDropHelper),
new PropertyMetadata(null, OnDropCommandPropertyChanged));
}
public static ICommand GetDropCommand(DependencyObject source)
{
return (ICommand)source.GetValue(DropCommandProperty);
}
public static void SetDropCommand(DependencyObject source, ICommand value)
{
source.SetValue(DropCommandProperty, value);
}
protected static void OnDropCommandPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
UIElement uiElement = d as UIElement;
if (uiElement != null)
{
ICommand oldCommand = e.OldValue as ICommand;
ICommand newCommand = e.NewValue as ICommand;
//先反注册上次绑定的事件,再注册新事件
if (oldCommand != null)
{
uiElement.Drop -= OnDrop;
}
if (newCommand != null)
{
uiElement.Drop += OnDrop;
}
}
}
protected static void OnDrop(object sender, DragEventArgs e)
{
UIElement uiElement = sender as UIElement;
if (uiElement != null)
{
ICommand cmd = GetDropCommand(uiElement);
if (cmd != null)
{
if (cmd.CanExecute(e))
{
cmd.Execute(e);
}
}
}
}
}
} 用法:
<c:ListView Grid.Column="0"
x:Name="mainListView"
BorderThickness="1"
AllowDrop="True"
t:DragDropHelper.DropCommand="{Binding CommandDrop}"
/>