由于WPF ListBox没有SelectedIndices属性,有没有办法获取此信息?
请注意,由于可能存在重复的项目,因此无法使用IndexOf。
编辑:我希望避免代码隐藏 - 我可以从上下文菜单中将单个项目传递给视图模型,如下所示:
<MenuItem Header="Process Items" Command="{Binding UpOneCommand}" CommandParameter="{Binding RelativeSource={RelativeSource AncestorType={x:Type ContextMenu}}, Path=PlacementTarget.SelectedIndex}"/>
但是,我正在寻找一种方法来传递所有选定的指数。
由于
答案 0 :(得分:0)
您可以通过一个简单的视图模型来解决这个问题,该模型包裹了您希望在ListBox
中显示的数据。这个包装器公开了一个额外的布尔IsSelected
属性:
class SelectionWrapper<TModel> : INotifyPropertyChanged
{
private boolean _isSelected;
private TModel _model;
public SelectionWrapper(TModel model)
{
Model = model;
}
public bool IsSelected
{
get { return _isSelected; }
set
{
_isSelected = value;
OnPropertyChanged();
}
}
public TModel Model
{
get { return _model; }
set
{
_model = value;
OnPropertyChanged();
}
}
// Implement INotifyPropertyChanged ...
}
不是直接将数据添加到ObservableCollection
,而是使用包装器视图模型包装数据。
为DataTemplate
写一个ListBox
,将CheckBox
绑定到此属性,并添加另一个控件以显示视图模型/模型的剩余部分(如{ {1}}显示字符串)。
查询所选项的一种方法可以是使用简单LINQ的只读属性:
Label
每次更改集合中任何项目的public IEnumerable<YourItemWrapperViewModel> SelectedIndicies
{
get
{
return YourItemsCollection.Where(item => item.IsSelected);
}
}
时,都应为PropertyChanged
调用SelectedIndicies
事件。要解决此问题,请观察IsSelected
添加/删除的项目:
ObservableCollection
注册处理程序。