Is there a way to pass a parameter (or multiple params) to the CallMethodAction behavior?

吃可爱长大的小学妹 提交于 2019-11-29 07:02:58
kruvi

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

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;
  }
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!