0

「ショッピング リスト」から「ショッピング カート」リスト ボックスにアイテムをダブルクリックしてコピーしたい。現在、私のモデルには各リストの文字列の ObservableCollection しかありませんが、最終的にオブジェクトはより複雑になります。

ViewModel は、DataTemplate を使用してビューにマップされます。現在、ViewModel に「Session」プロパティがあり、両方の ObservableCollection を含むモデルで Session オブジェクトを公開しています。

私はこれを試しました...

<ListBox Name="listBoxShopList" ItemsSource="{Binding Path=Session.Products}">
  <ListBox.ItemContainerStyle>
    <Style TargetType="{x:Type ListBoxItem}" BasedOn="{StaticResource {x:Type ListBoxItem}}">
      <EventSetter Event="MouseDoubleClick" Handler="ListBoxItemMouseDoubleClick"/>
    </Style>
  </ListBox.ItemContainerStyle>
</ListBox>
<ListBox Name="listBoxCart" ItemsSource="{Binding Path=Session.CartItems, UpdateSourceTrigger=PropertyChanged}"/>

コード ビハインドからイベントを取得し、SelectedItem を取得できます。しかし、MVVM は初めてなので、アイテムを「カート」コレクションに追加する方法がわかりません。ビューができるので、ViewModel Session.CartItems に直接アクセスできるはずです。パラメータ化されたコマンドは進むべき道ですか? もしそうなら、お勧めの記事はありますか?

4

2 に答える 2

1

イベント ハンドラーのコード ビハインドでは、次のように ViewModel を取得できます。

var viewModel = DataContext as <YourViewModelType>;

そして、選択した商品をカートに移します。
のようなコマンドを使用することをお勧めしますDelegateCommand

于 2012-11-01T12:33:16.533 に答える
1

ダブルクリックすると、ハンドラー (ビュー コードの一部) が呼び出されます。これまでのところ良い。

ここで、コマンドを呼び出す (推奨される方法) か、DataContext を介して VM と通信する (簡単な方法) ことによって、ダブルクリックが発生したことを VM に通知する必要があります。 )。VM は ObservableCollection を適切に更新でき、ビューは通常のバインディングを通じて変更を取得します。

于 2012-11-01T12:30:00.640 に答える