题
在我学习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与支持排序和过滤绑定到WPF中的列表:
<ListView ItemsSource="{Binding Path=OrdersView}"
IsSynchronizedWithCurrentItem="True">
这对单选视图非常有效。但我还想支持视图中的多个选择,并让模型绑定到所选项的列表。
如何将ListView.SelectedItems绑定到ViewModel上的backer属性?
解决方案
将 IsSelected
属性添加到您的子ViewModel(在您的情况下为 OrderViewModel
):
public bool IsSelected { get; set; }
将容器上的selected属性绑定到此(在本例中为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
这个常见问题有一个简单的解决方案;要使其发挥作用,您必须遵循所有以下规则:
-
按照 Ed Ball的建议,在您的XAML命令数据绑定中,定义
CommandParameter
属性 BEFORECommand
属性。 这是一个非常耗时的错误。 -
确保您的
ICommand
的CanExecute
和Execute
方法的参数类型为object
。这样,只要数据绑定的CommandParameter
类型与Command
方法的参数类型不匹配,就可以防止沉默强制转换异常:private bool OnDeleteSelectedItemsCanExecute(object SelectedItems) { // Your code goes here } private bool OnDeleteSelectedItemsExecute(object SelectedItems) { // Your code goes here }
醇>
例如,您可以将 ListView
/ ListBox
的 SelectedItems
属性发送到 ICommand
方法或者 ListView
/ ListBox
本身。好的,不是吗?
我希望这可以防止有人花费大量时间来弄清楚如何接收 SelectedItems
作为 CanExecute
参数。
可以尝试创建附加属性。
这样做可以为您绑定的每个列表添加 IsSelected
属性。我已经为 ListBox
完成了它,但是可以修改它以在列表视图中使用a。
<ListBox SelectionMode="Multiple"
local:ListBoxMultipleSelection.SelectedItems="{Binding SelectedItems}" >
如果你正在使用MVVM-LIGHT,你可以使用这种模式:
https:// galasoft .CH /帖/ 2010/05 /处理 - 数据网格-selecteditems功能于一个-MVVM友好的方式
不是特别优雅,但看起来至少应该是可靠的