kru*_*uvi 9

尝试使用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>
Run Code Online (Sandbox Code Playgroud)

希望能帮助到你


Jon*_*uis 5

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

public void SomeMethod(object sender, EventArgs args) {
  // do something
}
Run Code Online (Sandbox Code Playgroud)

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

public class MyEventArgs : EventArgs {

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

     MyParam Param { get; private set; }
}
Run Code Online (Sandbox Code Playgroud)

因此允许以下签名:

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

作为参考,这是 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;
  }
Run Code Online (Sandbox Code Playgroud)