web-dev-qa-db-ja.com

WPFのViewModelのメソッドにコマンドパラメータを渡しますか?

CommandParameterのメソッドにViewModelを渡そうとしています。これを行う方法?

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

これは、ViewModelで渡したいCommandParameterの私の名前です。ボタンにはCommandParameterを使用します。

19
Mahsa

「ViewModel」はMVVMを意味します。 MVVMを実行している場合、ビューモデルにビューを渡すことはできません。通常、XAMLで次のようなことを行います。

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

そして、これはあなたのビューモデルで:

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

明らかにこれはポイントを説明するためだけのものであり、ViewModelItemという名前の編集するプロパティが1つしかない場合は、コマンドパラメーターとして渡す必要はありません。

41
Mark Feldman

あなたがビューモデルに要素を渡すことにその特定の場合あなたが使用することができます

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

データバインディング構文を使用するだけです。例えば、

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

データバインディングを使用してビューモデルからデータを取得できるだけでなく、データをビューモデルに戻すこともできます。 CommandParameterでは、ElementNameを使用して、バインディングソースを明示的に宣言する必要があります。

3
John Zhu

個人的には、次のように.Tag属性を使用します。

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

次に、オブジェクト全体を取得するために:

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