2015-08-18 10 views
13

Sto cercando di passare CommandParameter al metodo nel mio ViewModel. Come fare questo?Passa il parametro del comando al metodo in ViewModel in WPF?

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

Questo è il mio meyhod in ViewModel che voglio passare CommandParameter. Io uso CommandParameter per il pulsante.

risposta

25

"ViewModel" implica MVVM. Se stai facendo MVVM non dovresti passare viste ai tuoi modelli di vista. In genere si fa qualcosa di simile nel tuo XAML:

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

E poi questo nel vostro modello di 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... 
} 

Ovviamente questo è solo per illustrare il punto, se si ha una sola proprietà di modificare chiamato ViewModelItem quindi non è necessario passarlo come parametro di comando.

+0

come utilizzare RaisePropertyChanged()? – Mahsa

+0

Questa è solo l'implementazione della notifica di modifica della proprietà MVVM Lite utilizza il quale è possibile aggiungere tramite NuGet (ricava il tuo modello di visualizzazione da ViewModelBase). Esistono numerosi altri modi per farlo, compresi quelli mostrati [qui] (https://msdn.microsoft.com/en-us/library/vstudio/ms743695 (v = vs.100) .aspx) e [qui] (http://stackoverflow.com/questions/1315621/implementing-inotifypropertychanged-does-a-better-way-exist). –

5

Se siete quel particolare di passare elementi per ViewModel È possibile utilizzare

CommandParameter="{Binding ElementName=ManualParcelScanScreen}" 
0

Proprio utilizzando sintassi di associazione dati. Ad esempio,

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

Non solo possiamo usare Associazione dati per ottenere alcuni dati da visualizzare i modelli, ma anche passare i dati di nuovo a visualizzare i modelli. In CommandParameter, è necessario utilizzare ElementName per dichiarare esplicitamente l'origine dell'associazione.

Problemi correlati