DelegateCommand 怎么绑定 Drop事件获取按钮对象和 DragEventArgs 对象 找不到e
时间: 2024-03-19 14:45:11 浏览: 66
在WPF中,可以使用`Microsoft.Xaml.Behaviors.Wpf`命名空间提供的`EventTrigger`和`InvokeCommandAction`来实现`DelegateCommand`与事件的绑定。下面是一个示例代码,演示如何在`Drop`事件中获取按钮对象和`DragEventArgs`对象并将其传递给`DelegateCommand`。
```xml
<Window xmlns:i="http://schemas.microsoft.com/xaml/behaviors">
<Button Content="Drag me" AllowDrop="True">
<i:Interaction.Triggers>
<i:EventTrigger EventName="Drop">
<i:InvokeCommandAction Command="{Binding DropCommand}"
CommandParameter="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type Button}}, Path=., Converter={StaticResource ButtonDragEventArgsConverter}}"/>
</i:EventTrigger>
</i:Interaction.Triggers>
</Button>
</Window>
```
在这个示例中,我们使用`Interaction.Triggers`属性来定义一个`EventTrigger`,它会在`Drop`事件发生时触发。`InvokeCommandAction`会将`DropCommand`绑定到事件上,并将按钮对象和`DragEventArgs`对象作为参数传递给`DelegateCommand`。需要注意的是,为了获取按钮对象,我们使用了`RelativeSource`绑定,而为了将`DragEventArgs`对象转换为`Tuple<Button, DragEventArgs>`类型,我们需要实现一个`IValueConverter`,如下所示:
```csharp
public class ButtonDragEventArgsConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
var args = value as DragEventArgs;
var button = parameter as Button;
return Tuple.Create(button, args);
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
```
这个转换器的作用是将按钮对象和`DragEventArgs`对象打包成一个`Tuple<Button, DragEventArgs>`类型,以便在`DelegateCommand`中进行处理。在`DelegateCommand`的执行方法中,我们可以像下面这样获取按钮对象和`DragEventArgs`对象:
```csharp
private void OnDropCommandExecuted(object parameter)
{
var tuple = parameter as Tuple<Button, DragEventArgs>;
var button = tuple.Item1;
var args = tuple.Item2;
// do something with button and args...
}
```
阅读全文