2017-07-20 10 views
-2

J'essaie de passer deux paramètres ICommand sur un bouton cliquer sur une méthode dans le modèle de vue.Passer deux paramètres de commande sur le bouton, cliquez sur WPF NET 3.5 MVVM

Maintenant, je ne peux passer qu'un seul paramètre.

Code ici.

XAML (Voir):

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

Voir Modèle:

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 
    } 

Maintenant, je veux passer un autre paramètre ICommand sur le bouton clic. Le paramètre que je veux transmettre est la valeur (cochée ou non) d'une case à cocher.

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

de telle sorte que AddUser méthode dans le modèle de vue sera en dessous de la signature:

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

Je sais que cela peut être fait en utilisant MultiBinding en combinaison avec un convertisseur mais je ne sais pas exactement comment le faire. Aussi, je ne comprends pas du tout pourquoi un convertisseur est nécessaire lors de l'utilisation de la liaison multiple.

+2

Bien que la liaison soit probablement plus verbeuse que vous le souhaiteriez, c'est probablement aussi la bonne façon d'y aller. Si vous avez besoin d'un convertisseur, vous en avez besoin pour les mêmes raisons que si vous renvoyiez un objet (DTO) à partir d'une méthode: car la méthode ne peut retourner qu'une seule chose. –

+1

Peut-être un bon [post] (https://stackoverflow.com/questions/15759308/do-you-have-to-use-a-converter-when-using-multibinding-in-wpf) pour répondre _why un convertisseur est Pourquoi utiliser la liaison multiple? –

+1

Pourquoi la case à cocher n'est-elle pas liée à votre modèle de vue? Si c'était le cas, vous pourriez simplement regarder la valeur. – Will

Répondre

1

Une commande ne prend qu'un seul paramètre. La méthode Execute de l'interface ICommand est définie comme:

void Execute(object parameter); 

Vous ne pouvez pas passer deux paramètres à une commande.

Ce que vous pouvez faire est de passer une instance d'une classe qui a deux propriétés. C'est ici que le convertisseur multiple entre en jeu.

Liez le CommandParameter à deux propriétés et utilisez le convertisseur pour renvoyer un objet.

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> 

Converter:

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(); 
    } 
} 

Voir Modèle:

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 
} 

Bien sûr, vous devez également définir le type de charge utile YourClass avec les deux paramètres IDUser et IsChecked.

+0

@ user1624552: Avez-vous essayé cela? – mm8