Есть ли способ передать параметр (или несколько параметров) в поведение CallMethodAction? - PullRequest
7 голосов
/ 22 февраля 2011

Есть ли способ передать параметр (или несколько параметров) в поведение CallMethodAction?

Ответы [ 2 ]

8 голосов
/ 08 марта 2011

Попробуйте 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>

Надеюсь, это поможет

4 голосов
/ 20 мая 2014

После некоторой декомпиляции получается, что 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;
  }
...