开发者

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

开发者 https://www.devze.com 2023-02-13 02:05 出处:网络
Is there a way to pass a parameter (or multiple params) to the CallMethod开发者_开发知识库Action behavior?Try InvokeCommandAction a command instead of using CallMethodAction:

Is there a way to pass a parameter (or multiple params) to the CallMethod开发者_开发知识库Action behavior?


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

精彩评论

暂无评论...
验证码 换一张
取 消