我通常从视图模型中公开一个 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 状态。
这有帮助吗?