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.
"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.
Si vous êtes ce particulier pour passer des éléments à viewmodel Vous pouvez utiliser
CommandParameter="{Binding ElementName=ManualParcelScanScreen}"
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.
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;
...
}