español c# wpf mvvm icommand

c# - español - commandparameter wpf



¿Pasar parámetro de comando a método en ViewModel en WPF? (4)

Estoy tratando de pasar CommandParameter al método en mi ViewModel . ¿Como hacer esto?

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

Este es mi método en ViewModel que quiero pasar CommandParameter . Yo uso CommandParameter para el botón.


"ViewModel" implica MVVM. Si está haciendo MVVM, no debería pasar vistas a sus modelos de vista. Normalmente haces algo como esto en tu XAML:

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

Y luego este en su modelo de vista:

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... }

Obviamente, esto es solo para ilustrar el punto, si solo tuviera una propiedad para editar llamada ViewModelItem, entonces no tendría que pasarla como un parámetro de comando.


Personalmente, simplemente uso el atributo .Tag como sigue:

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

Entonces para obtener el objeto completo:

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


Sólo utilizando la sintaxis de enlace de datos. Por ejemplo,

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

No solo podemos usar el enlace de datos para obtener algunos datos de los modelos de vista, sino que también podemos pasar los datos a los modelos de vista. En CommandParameter, debe usar ElementName para declarar explícitamente el origen del enlace.


Si eres tan especial para pasar elementos a viewmodel puedes usar

CommandParameter="{Binding ElementName=ManualParcelScanScreen}"