Shi*_*mmy 7 xaml mvvm expression-blend
有没有办法将参数(或多个参数)传递给CallMethodAction
行为?
尝试使用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)
希望能帮助到你
经过一些反编译,结果证明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)