1

質問: コマンド バインディングを使用する場合、ビュー モデルにデータを送信するにはどうすればよいですか? たとえば、ボタンをクリックすると、リストの「現在選択されているインデックス」が送信され、リストのその項目に対して操作を実行できるようになります


詳細情報: 私は貨物のリストを持っているプログラムに取り組んでおり、各貨物にはパレットのリストがあります。現在選択されている貨物に新しいパレットを追加できるボタンを作成したいと考えています。>編集> そして、もう 1 つの作業を進めると、各パレットには製品のリストが表示されます。そのため、自分がどの貨物に乗っているかを知る必要があるだけでなく、どの貨物のどのパレットに乗っているかも知る必要があります。

コマンド バインディングを行うとき、ViewModel にデータを送信する方法がわかりません。この純粋な MVVM を保持したいので、ViewModel でビューをチェックしたくありません。

~N


編集: 11/04/09 - ViewModel のインスタンス化に関する質問のセクションを削除しました。これは他の質問を解決するために順調に進んでいるので、別の質問でもう一度尋ねます。そして、私が望む方向に明確にするために、質問にいくつかの編集を加えました。また、いくつかの文法的なビットを変更して、1 つしかない場合に 2 つの質問について話さないようにしました。

4

2 に答える 2

2

私は通常、ビュー モデルから CollectionView を公開し、ビューにリストを表示する ItemsControl に IsSynchronizedWithCurrentItem プロパティを設定します。次に、コマンドが実行されると、CollectionView.CurrentItem プロパティを調べて、現在何が選択されているかを確認できます。

編集: この回答は、質問の最初の質問に対応しています。ビューが現在選択されている項目を ViewModel に送信するのではなく、ViewModelは現在選択されている項目を追跡します。したがって、この手法を使用すると、その情報を送信する方法を考える必要はありません。

ビューモデルで次のようなもの:

class ApplicationViewModel
{
    // Exposes a list of ShipmentViewModels.
    public CollectionView Shipments { get; private set; }

    // A DelegateCommand or similar, that when executed calls AddPallet().
    public ICommand AddPalletCommand { get; private set; }

    void AddPallet()
    {
        ShipmentViewModel shipment = (ShipmentViewModel)Shipments.CurrentItem;
        shipment.Pallets.Add(new PalletViewModel(...));
    }
}

そして、これをあなたのxamlで:

<ListBox ItemsSource="{Binding Shipments}" IsSynchronizedWithCurrentItem="True"/>
<Button Command="{Binding AddPalletCommand}>Add Pallet</Button>

このようにして、ViewModel からの Shipments コレクションの選択を追跡し、コマンドの CanExecute 状態を更新することもできます。

それは何か役に立ちますか?

于 2009-11-03T19:40:18.277 に答える
0

現在選択されているアイテムを追跡するために、Grokyに似たようなことをします。おそらく、この例はもう少し意味があります。

リストがバインドされているコレクションを含むViewModel(この例ではListBoxを使用しています)で、選択したアイテムに関連するプロパティを公開します。

// Assuming your using the MVVM template from Microsoft
public class PalletListViewModel : ViewModelBase
{
   // The collection our list is bound to
   private ObservableCollection<Pallet> _palletList;
   // The current selected item
   private Pallet _selectedPallet;
   // Our command bound to the button
   private DelegateCommand _processCommand;

   public ObservableCollection<Pallet> PalletList
   {
      get { return _palletList; }
   }

   public Pallet SelectedPallet
   {
      get { return _selectedPallet; }
      set
      {
         if(value == _selectedPallet)
            return;

         _selectedPallet = value;

         // INotifyPropertyChanged Method for updating the binding
         OnPropertyChanged("SelectedPallet");
      }
   }

   public ICommand ProcessCommand
   {
      get
      {
         if(_processCommand == null)
            _processCommand = new DelegateCommand(Process);
         return _processCommand;
      }
   }

   private void Process()
   {
      // Process the SelectedPallet
   }
}

<Window ...>
   <Grid x:Name="LayoutRoot">
      <Button Content="Process Pallet" Command="{Binding ProcessCommand}" />
      <ListBox ItemsSource="{Binding PalletList}" SelectedItem="{Binding SelectedPallet}">
         ...
      </ListBox>
   </Grid>
</Window>

うまくいけば、これはあなたが探しているものです。

于 2009-11-04T14:36:12.947 に答える