有没有办法将参数(或多个参数)传递给CallMethodAction行为?

时间:2011-02-22 01:08:21

标签: xaml mvvm expression-blend

有没有办法将参数(或多个参数)传递给CallMethodAction行为?

2 个答案:

答案 0 :(得分:8)

尝试使用InvokeCommandAction命令而不是使用CallMethodAction:

<i:Interaction.Triggers>
  <i:EventTrigger EventName="TextChanged">
    <i:InvokeCommandAction Command="{Binding TextChangedCommand}" 
        CommandParameter="{Binding ElementName=filterBox, Path=Text}"/>
  </i:EventTrigger>
</i:Interaction.Triggers>

希望有所帮助

答案 1 :(得分:4)

经过一些反编译后,发现CallMethodAction 支持使用参数调用方法。但是,CallMethodAction对预期签名非常严格。方法必须符合以下条件:

public void SomeMethod(object sender, EventArgs args) {
  // do something
}

其中args参数可以是EventArgs的子类,因此允许传入(任意数量)自定义参数。例如:

public class MyEventArgs : EventArgs {

     public MyEventArgs(MyParam param) {
         Param = param;
     }

     MyParam Param { get; private set; }
}

因此允许以下签名:

public void SomeMethod(object sender, MyEventArgs args) {
      var param = args.Param;
      // do something
}    

作为参考,这里是执行符合性检查的CallMethodAction中的代码:

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