WPF和Listview.Shift - 选择多个项目.错误的开始项目

Tac*_*ree 9 wpf listview multipleselection

问题解释:

给出包含10个项目的列表.

  1. 我的第一个动作是(鼠标)点击第二个项目.
  2. 其次我有一个按钮,应该以编程方式选择一个项目.

例如:

listView.SelectedIndex = 4; 
//or
listView.SelectedItems.Add(listView.Items[4]);
Run Code Online (Sandbox Code Playgroud)

该项目已正确选择.

  1. 如果我现在按SHIFT并选择最后一项,则选择将从单击的项目开始,而不是以编程方式选择的项目.

一种解决方案是模拟鼠标点击事件,该事件有效,但有副作用.它也是hacky的方式.

似乎鼠标事件存储起始项目.

有什么我忽略了吗?

Art*_*iom 7

我在MSDN上询问过这个问题.令人惊讶的是,这个问题的原因是SelectionMode

问题可能出在ListBox代码中(ListView派生自ListBox):

protected override void OnSelectionChanged(SelectionChangedEventArgs e)
{   ...
    if ((this.SelectionMode == SelectionMode.Single) && (base.SelectedItem != null))
    {
       ...
        if (selectedItem != null)
        {
            this.UpdateAnchorAndActionItem(selectedItem);
    }
}
Run Code Online (Sandbox Code Playgroud)

如果SelectionMode是Extended,则不会调用UpdateAnchorAndActionItem(selectedItem).

所以,在后面的代码中你必须做下一步:

list.SelectionMode = SelectionMode.Single;
list.SelectedIndex = 4;
list.SelectionMode = SelectionMode.Extended;
Run Code Online (Sandbox Code Playgroud)

不太了解MVVM的情况.

Upd1

我已经创建了自定义ListView.它将在上述逻辑内部完成.在这种情况下,即使在MVVM中,它也必须按预期工作.我希望它会对你有所帮助.

public class MyListView:ListView
{
    protected override void OnSelectionChanged(SelectionChangedEventArgs e)
    {
        //if it is multiselection than execute standard logic
        if(SelectedItems.Count!=1)
        {
            base.OnSelectionChanged(e);
            return;
        }
        var mode = SelectionMode;
        SelectionMode = SelectionMode.Single;
        base.OnSelectionChanged(e);
        SelectionMode=mode;
    }
}
Run Code Online (Sandbox Code Playgroud)