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

问题描述:

我想通过按钮上的两个ICommand参数点击视图模型中的方法。传递两个命令参数上的按钮点击WPF NET 3.5 MVVM

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

代码在这里。

XAML(查看)

<Button x:Name="btnAdd" Command="{Binding AddUserCommand}" 
         CommandParameter="{Binding IDUser}"/> 

视图模型

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 
    } 

现在我想通过按钮点击另一个ICommand的参数。 我想传递的参数是复选框中的值(选中或不选)。

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

所以鉴于模型方法ADDUSER将有以下特征:

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

我知道它可以使用MultiBinding进行结合转换器,但我不知道究竟该怎么做。此外,我不明白为什么使用多重绑定时转换器是必需的。

+2

虽然绑定可能比您想要的更冗长,但它也可能是正确的选择。如果你确实需要一个转换器,你需要它的原因是你会从一个方法返回一个(DTO)对象:因为该方法只能返回一件事情。 –

+1

也许一个很好的[发布](https://*.com/questions/15759308/do-you-have-to-use-a-converter-when-using-multibinding-in-wpf)回答_为什么一个转换器是使用多重绑定时需要._ –

+1

为什么复选框未绑定到您的视图模型?如果是这样,你可以简单地看看价值。 – Will

一个命令只有一个参数。所述ICommand接口的Execute方法被定义为:

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 
} 

当然,你也绝使用IDUserIsChecked这两个参数定义有效载荷类型YourClass

+0

@ user1624552:你试过这个吗? – mm8