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

穿精又带淫゛_ 提交于 2019-11-28 00:33:20

问题


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


来源:https://stackoverflow.com/questions/5073065/is-there-a-way-to-pass-a-parameter-or-multiple-params-to-the-callmethodaction

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