WPF ListBox - 获取所选项目的索引

时间:2017-09-08 23:24:37

标签: c# wpf listbox

由于WPF ListBox没有SelectedIndices属性,有没有办法获取此信息?

请注意,由于可能存在重复的项目,因此无法使用IndexOf。

编辑:我希望避免代码隐藏 - 我可以从上下文菜单中将单个项目传递给视图模型,如下所示:

<MenuItem Header="Process Items" Command="{Binding UpOneCommand}" CommandParameter="{Binding RelativeSource={RelativeSource AncestorType={x:Type ContextMenu}}, Path=PlacementTarget.SelectedIndex}"/>

但是,我正在寻找一种方法来传递所有选定的指数。

由于

1 个答案:

答案 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注册处理程序。
  • 如果项目已被删除,请取消注册处理程序。