webentwicklung-frage-antwort-db.com.de

Befehlsparameter an Methode in ViewModel in WPF übergeben?

Ich versuche, CommandParameter an die Methode in meiner ViewModel..__ zu übergeben. Wie mache ich das?

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

Dies ist mein meyhod in ViewModel, den ich CommandParameter übergeben möchte. Ich benutze CommandParameter für die Schaltfläche.

17
Mahsa

"ViewModel" impliziert MVVM. Wenn Sie MVVM verwenden, sollten Sie keine Ansichten an Ihre Ansichtsmodelle übergeben. Normalerweise machen Sie so etwas in Ihrer XAML:

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

Und dann das in Ihrem Ansichtsmodell:

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

Natürlich dient dies nur der Veranschaulichung. Wenn Sie nur eine Eigenschaft namens ViewModelItem zum Bearbeiten hätten, müssten Sie sie nicht als Befehlsparameter übergeben.

35
Mark Feldman

Wenn Sie genau so sind, um Elemente an Viewmodel zu übergeben, können Sie verwenden

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

Verwenden Sie einfach die Data Binding-Syntax. Zum Beispiel,

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

Wir können Datenbindung nicht nur verwenden, um Daten aus Ansichtsmodellen abzurufen, sondern auch Daten an Ansichtsmodelle zurückgeben. In CommandParameter muss ElementName verwendet werden, um die Bindungsquelle explizit zu deklarieren.

2
John Zhu

Ich persönlich benutze einfach das .Tag-Attribut wie folgt:

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

Dann, um das ganze Objekt zu bekommen:

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