web-dev-qa-db-fra.com

Passer le paramètre de commande à la méthode dans ViewModel dans WPF?

J'essaie de passer CommandParameter à la méthode dans ma ViewModel. Comment procéder?

private void Open(object sender)
{
    if (sender==this.objMainWindow.btnHistory)
    {
        objMainWindow.Container.Child = objHistory;
    }

    if (sender == this.objMainWindow.btnNew_Item)
    {
        objMainWindow.Container.Child = objNewItem;
    }

    if (sender == this.objMainWindow.btnSide_Effects)
    {
        objMainWindow.Container.Child = objSideEffect;
    }
}

C’est ma méthode dans ViewModel que je veux transmettre CommandParameter. J'utilise CommandParameter pour le bouton.

17
Mahsa

"ViewModel" implique MVVM. Si vous utilisez MVVM, vous ne devriez pas transmettre de vues à vos modèles de vues. En général, vous faites quelque chose comme ça dans votre XAML:

<Button Content="Edit" 
        Command="{Binding EditCommand}"
        CommandParameter="{Binding ViewModelItem}" >

Et puis ceci dans votre modèle de vue:

private ViewModelItemType _ViewModelItem;
public ViewModelItemType ViewModelItem
{
    get
    {
        return this._ViewModelItem;
    }
    set
    {
        this._ViewModelItem = value;
        RaisePropertyChanged(() => this.ViewModelItem);
    }
}

public ICommand EditCommand { get { return new RelayCommand<ViewModelItemType>(OnEdit); } }
private void OnEdit(ViewModelItemType itemToEdit)
{
    ... do something here...
}

Évidemment, ceci est juste pour illustrer le point, si vous n'aviez qu'une seule propriété à éditer appelée ViewModelItem, vous n'auriez pas besoin de la transmettre comme paramètre de commande.

35
Mark Feldman

Si vous êtes ce particulier pour passer des éléments à viewmodel Vous pouvez utiliser

 CommandParameter="{Binding ElementName=ManualParcelScanScreen}"
6
Justin CI

Juste en utilisant la syntaxe de liaison de données. Par exemple,

<Button x:Name="btn" 
         Content="Click" 
         Command="{Binding ClickCmd}" 
         CommandParameter="{Binding ElementName=btn,Path=Content}" /> 

Nous pouvons non seulement utiliser la liaison de données pour extraire certaines données de View Models, mais également les renvoyer à View Models. Dans CommandParameter, vous devez utiliser NomElément pour déclarer explicitement la source de la liaison.

2
John Zhu

Personnellement, j'utilise simplement l'attribut .Tag comme suit:

<Button Content="Button" Click="Button_Click" Tag="{Binding .}"></Button>

Ensuite, afin d'obtenir l'objet entier:

private void Button_Click(object sender, RoutedEventArgs e)
    {
        var btn = sender as Button;
        var myViewModel = btn.Tag as MyViewModel;
        ...
    }
0
Matteo Gariglio