1

问题:使用命令绑定时如何将数据发送到视图模型?这样,例如,当我单击一个按钮时,它会发送列表的“当前选定的索引”,以便它可以对列表的该项目执行操作


更多信息:我正在开发一个程序,其中我有一个装运清单,每个装运都有一个托盘清单。我想制作一个按钮,允许我向当前选定的货件添加新托盘。>编辑> 并通过另一个扳手进入作品,每个托盘都有一个产品清单。所以我不仅需要知道我在什么货件上,而且我还需要知道我在什么货件的哪个托盘上。

当我执行命令绑定时,我不知道如何将数据发送到 ViewModel。我想保留这个纯 MVVM,所以我不想让 ViewModel 检查视图中的任何内容。

~N


编辑:11/04/09 - 我删除了关于 ViewModel 实例化的问题部分。我将在另一个问题中再次问这个问题,因为这个问题正在解决另一个问题。我对这个问题做了一些其他的编辑,以明确我想要的方向。以及更改了一些语法位,以便当只有一个问题时它不是在谈论两个问题。

4

2 回答 2

2

我通常从视图模型中公开一个 CollectionView 并在 ItemsControl 上设置 IsSynchronizedWithCurrentItem 属性,以在视图中显示列表。然后在执行命令时,我可以检查 CollectionView.CurrrentItem 属性以查看当前选择的内容。

编辑:这个答案解决了你的第一个问题,嗯,问题。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 回答