Is there a way to pass a parameter (or multiple pa

2020-02-11 04:13发布

问题:

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;
  }