使用MVVMpipe理多个select

在我学习MVVM的过程中,我已经对WPF和ViewModel模式有了一些基本的了解。 我在提供列表时使用以下抽象,并对单个选定项目感兴趣。

public ObservableCollection<OrderViewModel> Orders { get; private set; } public ICollectionView OrdersView { get { if( _ordersView == null ) _ordersView = CollectionViewSource.GetDefaultView( Orders ); return _ordersView; } } private ICollectionView _ordersView; public OrderViewModel CurrentOrder { get { return OrdersView.CurrentItem as OrderViewModel; } set { OrdersView.MoveCurrentTo( value ); } } 

然后,我可以将OrdersView和支持的sorting和筛选绑定到WPF中的列表中:

 <ListView ItemsSource="{Binding Path=OrdersView}" IsSynchronizedWithCurrentItem="True"> 

这对于单选视图非常有效。 但我也想支持在视图中的多个select,并将模型绑定到所选项目的列表。

我如何将ListView.SelectedItems绑定到ViewModel上的backer属性?

添加一个IsSelected属性到你的子ViewModel( OrderViewModel在你的情况):

 public bool IsSelected { get; set; } 

绑定容器上的选定属性(在这种情况下为ListBox):

 <ListBox.ItemContainerStyle> <Style TargetType="{x:Type ListBoxItem}"> <Setter Property="IsSelected" Value="{Binding Mode=TwoWay, Path=IsSelected}"/> </Style> </ListBox.ItemContainerStyle> 

IsSelected被更新以匹配容器上的对应字段。

您可以通过执行以下操作来获取视图模型中选定的子项:

 public IEnumerable<OrderViewModel> SelectedOrders { get { return Orders.Where(o => o.IsSelected); } } 

我可以向你保证: SelectedItems确实可以绑定为一个XAML CommandParameter

这个常见问题有一个简单的解决办法。 要使其工作,您必须遵循以下所有规则:

  1. 按照Ed Ball的build议 ,在您的XAML命令数据绑定中,定义Command属性之前CommandParameter属性。 这是一个非常耗时的错误

    在这里输入图像说明

  2. 确保你的ICommandCanExecuteExecute方法有一个objecttypes的参数。 通过这种方法,您可以防止在数据绑定的CommandParametertypes与Command方法的参数types不匹配时发生的沉默转换exception:

     private bool OnDeleteSelectedItemsCanExecute(object SelectedItems) { // Your code goes here } private bool OnDeleteSelectedItemsExecute(object SelectedItems) { // Your code goes here } 

例如,您可以将ListView / ListBoxSelectedItems属性发送到您的ICommand方法或ListView / ListBox本身。 太好了,不是吗?

我希望这可以防止有人花费大量的时间来弄清楚如何接收SelectedItems作为CanExecute参数。

人们可以尝试创build一个附加的属性。

这样做可以节省您为每个绑定的列表添加IsSelected属性。 我已经做了ListBox ,但它可以修改为在列表视图中使用。

 <ListBox SelectionMode="Multiple" local:ListBoxMultipleSelection.SelectedItems="{Binding SelectedItems}" > 

更多信息: WPF – 绑定列表框SelectedItems – 附加属性VS风格 。

如果您使用MVVM-LIGHT,则可以使用以下模式:

http://blog.galasoft.ch/archive/2010/05/19/handling-datagrid.selecteditems-in-an-mvvm-friendly-manner.aspx

不是特别优雅,但至less看起来应该是可靠的