在按钮上传递两个命令参数单击WPF NET 3.5 MVVM

时间:2017-07-20 15:39:19

标签: c# wpf mvvm icommand multibinding

我试图在按钮点击时将两个ICommand参数传递给视图模型中的方法。

现在我只能传递一个参数。

此处代码。

XAML(查看)

    public string IDUser
    {
        get
        {
            return this.personalData.UserID;
        }

        set
        {
            if (this.personalData.UserID == value)
            {
                return;
            }

            this.personalData.UserID = value;
            OnPropertyChanged("UserID");
        }
    }


    private RelayCommand addUserCommand;
    public ICommand AddUserCommand
    {
        get
        {
            return addUserCommand ??
                (addUserCommand = new RelayCommand(param => this.AddUser(param.ToString())));
        }
    }

    public vol AddUser(string userId)
    {
         // Do some stuff
    }

查看模型

<CheckBox x:Name="Status" Content="Married"/>

现在我想在按钮点击时传递另一个ICommand参数。 我要传递的参数是复选框中的值(已选中或未选中)。

    public vol AddUser(string userId, bool status)
    {
         // Do some stuff
    }

因此视图模型中的方法AddUser将具有以下签名:

{{1}}

我知道可以将MultiBinding与转换器结合使用,但我不知道该怎么做。另外,我不明白为什么在使用多重绑定时需要转换器。

1 个答案:

答案 0 :(得分:1)

命令只接受一个参数。 Execute接口的ICommand方法定义为:

void Execute(object parameter);

因此,您无法将两个参数传递给命令。

您可以做的是传递具有两个属性的类的实例。这就是多转换器的用武之地。

CommandParameter绑定到两个属性并使用转换器返回一个对象。

<强> XAML:

<Button x:Name="btnAdd" Command="{Binding AddUserCommand}">
    <Button.CommandParameter>
        <MultiBinding Converter="{StaticResource yourConverter}">
            <Binding Path="IDUser" />
            <Binding Path="IsChecked" ElementName="Status" />
        </MultiBinding>
    </Button.CommandParameter>
</Button>

<强>转换器:

public class Converter : IMultiValueConverter
{
    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
    {
        return new YourClass() { IdUser = values[0] as string, IsChecked = System.Convert.ToBoolean(values[1]) };
    }

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

查看型号:

private RelayCommand<YourClass> addUserCommand;
public ICommand AddUserCommand
{
    get
    {
        return addUserCommand ??
            (addUserCommand = new RelayCommand<YourClass>(param => this.AddUser(param)));
    }
}

public vol AddUser(YourClass obj)
{
    string IDUser = obj.IDUser;
    bool isChecked = obj.IsChecked;
    // Do some stuff
}

当然,您还必须使用YourClassIDUser两个参数定义IsChecked有效内容类型。