2017-06-03 9 views
0

私はウェブを検索していますが、必要な答えが見つかりません。ViewModelラッパーにデータをバインドし、パラメータとしてRelayCommandに渡す方法はありますか?

私はユーザーがいくつかの項目を選択できるリストを持っています。私のViewModelでは、それは次のようになります。ユーザーが選択し終わったら

public ObservableCollection<RentalItemVM> ChosenRentalItems { 
     get { return chosenRentalItems; } 
     set { 
      chosenRentalItems = value; 
      RaisePropertyChanged("ChosenRentalItems"); 
     } 
    } 

、彼は彼のコレクションを保存するためのボタンを押します。 I

public RelayCommand<ObservableCollection<RentalItemVM>> FinishCommand { get; set; } 
private void Finish(ObservableCollection<RentalItemVM> chosenItems) { 
     ... 
    } 

今、私は同様にユーザーIDを取得する必要があるので、いくつかの研究の後、私はそうRelayCommandに複数のparamaterを渡すことができないことがわかった:Iセットアップは、このように私のRelayCommandがあればそれが正常に動作しますラッパーが必要です。私は新しいViewModelに作られました:

public class OrderVM { 
    public int UserId { get; set; } 

    ObservableCollection<RentalItemVM> ChosenItems { get; set; } 
} 

をし、これにRelayCommandを変更:

public RelayCommand<OrderVM> FinishCommand { get; set; } 
private void Finish(OrderVM order) { 
     ... 
    } 

、私はここからXAMLのUserControlを変更:これに

<StackPanel Orientation="Horizontal" 
      Grid.Row="3" 
      Grid.ColumnSpan="2" 
      VerticalAlignment="Center" 
      HorizontalAlignment="Center"> 
     <TextBox Text="UserId" /> 
     <Button Content="Finish" 
       Command="{Binding FinishCommand}" 
       CommandParameter="{Binding ChosenRentalItems}" 
       UseLayoutRounding="False" 
       FontSize="24" /> 
    </StackPanel> 

<StackPanel Orientation="Horizontal" 
      Grid.Row="3" 
      Grid.ColumnSpan="2" 
      VerticalAlignment="Center" 
      HorizontalAlignment="Center"> 
     <TextBox Text="UserId" 
       x:Name="UserId" /> 
     <Button Content="Finish" 
       Command="{Binding FinishCommand}" 
       CommandParameter="{Binding OrderVM}" 
       UseLayoutRounding="False" 
       FontSize="24" /> 
    </StackPanel> 

ここで私はnfused。 UserIdとChosenItemをバインドする方法がわかりません。 RelayCommandのOrderVMパラメータはnullなので、最初にインスタンス化する必要がありますか?私はウェブ上で発見

ほとんどの答えは、ビューにビューモデルからのデータを表示するとしていたが、データをポストする方法にはほとんど答えない(または私は間違ったことで検索?)

答えて

1

コマンドFinishCommandた場合DataConextの同じビューモデルにある場合は、UserIdもバインドできます。

<TextBox Text="{Binding UserId} " x:Name="UserId"></TextBox> 

コマンドを実装しているViewModelインスタンスからUserIdを取得します。

private void Finish(ObservableCollection<RentalItemVM> chosenItems) { 
    var userid = this.UserId; 
    foo(userid); 
} 
+0

問題を再考した後、私もそれについて考えていました。しかし、実際にOrderVMをバインドする方法はありませんか? – Sensei

+0

あなたは 'ValueConverter'を使うことができますが、あなたは同じ問題に遭遇すると思います。 – Roland

関連する問題