Is there a way to pass a parameter (or multiple params) to the CallMethodAction
behavior?
可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
回答1:
Try InvokeCommandAction a command instead of using CallMethodAction:
<i:Interaction.Triggers>
<i:EventTrigger EventName="TextChanged">
<i:InvokeCommandAction Command="{Binding TextChangedCommand}"
CommandParameter="{Binding ElementName=filterBox, Path=Text}"/>
</i:EventTrigger>
</i:Interaction.Triggers>
Hope it helps
回答2:
After some decompiling it turns out that CallMethodAction
does support calling methods with parameters. However, CallMethodAction
is very strict on the expected signature. Methods must conform to the following:
public void SomeMethod(object sender, EventArgs args) {
// do something
}
Where the args parameter can be a subclass of EventArgs, which therefore allows passing in (any number of) custom parameters. For instance:
public class MyEventArgs : EventArgs {
public MyEventArgs(MyParam param) {
Param = param;
}
MyParam Param { get; private set; }
}
Thus allowing for the following signature:
public void SomeMethod(object sender, MyEventArgs args) {
var param = args.Param;
// do something
}
For reference, here's the code in CallMethodAction that performs the conformity check:
private static bool AreMethodParamsValid(ParameterInfo[] methodParams)
{
if (methodParams.Length == 2)
{
if (methodParams[0].ParameterType != typeof(object) || !typeof (EventArgs).IsAssignableFrom(methodParams[1].ParameterType))
return false;
}
else if (methodParams.Length != 0)
return false;
return true;
}