WPF 自带的ListView是支持多选的,在属性 SelectionMode 中可以进行设置。但是会有这样一个困扰,就是当我每次点击一个ListViewItem的时候,都会选中,这样就相当于只能多选不能单选。正常我们的逻辑都是按住【Ctrl】按键的时候能够进行多选,而其他情况下都是单选的。可以考虑下面的解决方案:
首先,给ListView建立一个 KeyDown 的事件,监测键盘中的按键情况,当按下【Ctrl】的时候,将 ListView 的选择模式属性【SelectionModel】修改为多选;
然后给ListView 建立一个 KeyUp 事件,判断当【Ctrl】按键松开的时候,再将 ListView 的选择模式【SelectionModel】设置回单选;
但是这样也会有一个问题,因为在设置回单选模式后,多选选中的都会消失,只保留最开始选中的那一条,这样不合理呀。
怎么办呢?如果 KeyUp 的时候不设置回单选,而是设置一个标志,表示【Ctrl】按键已经松开,然后在下次 ListView 点击的时候设置为单选。
嗯嗯,试了一下确实可行。但是有一个小问题,就是我点击了另一个 Item,假设是9号item吧,之前按住【Ctrl】选中了6,7,8号item,我希望在松开【Ctrl】之后,点击9号,能够将6,7,8都不选,选中9号,但是现在情况就是,9号不会被选中,而是6号被选中,这个选中的item就是按住【Ctrl】的时候第一个被选中的item。
但是我们就是想让9号选中呀,那就在多加一行判断,将最后的9号设置为 SelectedItem。
代码如下:
private bool bCtrl = false;
//按键按下事件,监测【Ctrl】
private void TestLv_OnKeyDown(object sender, KeyEventArgs e)
{
if (e.Key == Key.LeftCtrl)
{
this.testLv.SelectionMode = SelectionMode.Multiple;
bCtrl = true;
}
else
{
this.testLv.SelectionMode = SelectionMode.Single;
}
}
//按键松开,将状态置回
private void TestLv_OnKeyUp(object sender, KeyEventArgs e)
{
bCtrl = false;
}
//选中事件,对状态进行判断,然后设置回单选模式
private void TestLv_OnSelectionChanged(object sender, SelectionChangedEventArgs e)
{
if (!bCtrl)
{
this.testLv.SelectedItem = this.testLv.SelectedItems[this.testLv.SelectedItems.Count - 1];
this.testLv.SelectionMode = SelectionMode.Single;
}
}