将三个参数传递给 Prism DelegateCommand 以在不同的按钮命令上使用相同的命令【MVVM 模式】

Pass three parameters to Prism DelegateCommand to use the same command on different button commands [MVVM mode]

我有以下使用 Prism 库创建的 DelegateCommand。

public class AddressModel : INotifyPropertyChanged
{
    public ICommand MyButtonClickCommand
    {
        get { return new DelegateCommand<object>(FuncToCall); }
    }

    public void FuncToCall(object context)
    {
        //this is called when the button is clicked
        Method1("string1", integer_number1);
    }
}

我已经将 MyButtonClickCommand 绑定到 XAML 文件中的一个按钮。

<Button Content="Click me" 
        Command="{Binding MyButtonClickCommand}"/> 

但我想对另外 2 个按钮使用相同的 MyButtonClickCommand,而不是创建两个额外的 DelegateCommands MyButtonClickCommand1 & MyButtonClickCommand2

所以我想要的是添加 string1integer_number1 作为参数,并在不同的按钮上调用相同的 ICommand,如下所示

<Button Content="Click me" 
        Command="{Binding MyButtonClickCommand("string1", integer_number1)}"/>
<Button Content="Click me 2" 
        Command="{Binding MyButtonClickCommand("string2", integer_number2)}"/>
<Button Content="Click me 3" 
        Command="{Binding MyButtonClickCommand("string3", integer_number3)}"/>

使用 CommandParameter 属性:

<Button Content="Click me 2" 
        Command="{Binding MyButtonClickCommand}"
        CommandParameter="2" />

然后您可以将 context 参数转换为命令参数的任何值:

public void FuncToCall(object context)
{
    string parameter = context as string;
    if (int.TryParse(parameter, out int number))
    {
        //---
    }
}

您可以传递可以在 XAML

中声明的任何 class 的实例
public class MyCommandParameter
{
    public int MyInt { get; set; }
    public string MyString { get; set; }
}

到按钮的 CommandParameter 属性:

<Button Content="Click me" Command="{Binding ...}">
    <Button.CommandParameter>
        <local:MyCommandParameter MyInt="2" MyString="Hello"/>
    </Button.CommandParameter>
</Button>

MyCommandParameter 实例传递给 Execute 处理程序方法的参数:

public void FuncToCall(object parameter)
{
    var param = (MyCommandParameter)parameter;

    // do something with param.MyInt and param.MyString
}