基于 Bill Zhang 的行为理念,我创建了一个通用版本,它与控制无关并且允许重用。所需的组件是
xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
我创建了一个触发操作,将执行传递给事件处理程序:
using System.Windows;
using System.Windows.Input;
using System.Windows.Interactivity;
using System;
namespace Misc
{
public class CommandWithEventAction : TriggerAction<UIElement>
{
public event Func<object, object> Execute;
public static DependencyProperty CommandProperty = DependencyProperty.Register("Command", typeof(ICommand), typeof(CommandWithEventAction), null);
public ICommand Command
{
get
{
return (ICommand)GetValue(CommandProperty);
}
set
{
SetValue(CommandProperty, value);
}
}
public static DependencyProperty ParameterProperty = DependencyProperty.Register("Parameter", typeof(object), typeof(CommandWithEventAction), null);
public object Parameter
{
get
{
return GetValue(ParameterProperty);
}
set
{
SetValue(ParameterProperty, value);
}
}
protected override void Invoke(object parameter)
{
var result = Execute(Parameter);
Command.Execute(result);
}
}
}
为了避免自定义行为中的任何逻辑,这允许将任何事件连接到事件回调,然后是命令调用。
XAML:
<Button>
<i:Interaction.Triggers>
<i:EventTrigger EventName="Click">
<misc:CommandWithEventAction Command="{Binding LoadImageCommand}" Parameter="Custom data" Execute="CommandWithEventAction_OnExecute"/>
</i:EventTrigger>
</i:Interaction.Triggers>
Execute
</Button>
这会将作为对象装箱的“自定义数据”字符串传递给一个名为
CommandWithEventAction_OnExecute
它的签名Func<object,object>
可能会使用参数,并且需要返回一些东西,然后将这些东西装箱到对象中并传递给LoadImageCommand