如何以编程方式取消选择 ListViewItem?

Posted

技术标签:

【中文标题】如何以编程方式取消选择 ListViewItem?【英文标题】:How to deselect ListViewItem programmatically? 【发布时间】:2016-01-20 13:12:49 【问题描述】:

我被这个小问题困扰了一段时间。 W10 下的 ListView 有一些我无法理解的奇怪行为。考虑一个简单的列表:

<ListView Name="myList" ItemClick="myList_ItemClick" SelectionChanged="myList_SelectionChanged" IsItemClickEnabled="True">
    <ListView.Items>
        <TextBlock Text="First item"/>
        <TextBlock Text="Second item"/>
        <TextBlock Text="Third item"/>
        <TextBlock Text="Fifth item"/>
    </ListView.Items>
</ListView>

以及背后的代码:

private void myList_ItemClick(object sender, ItemClickEventArgs e)

    Debug.WriteLine("Clicked item");
    ListView list = sender as ListView;
    ListViewItem listItem = list.ContainerFromItem(e.ClickedItem) as ListViewItem;
    listItem.IsSelected = !listItem.IsSelected;


private void myList_SelectionChanged(object sender, SelectionChangedEventArgs e)

    Debug.WriteLine($"Selection changed -> added = e.AddedItems.Count, removed = e.RemovedItems.Count, currently selected = myList.SelectedItems.Count");

上面的代码在 W8.1 上运行得很好,但是在 W10 上我遇到了问题。选择第一个项目可以,也可以更改它,但我无法取消选择一个项目 - listview 似乎(来自调试输出)取消选择项目,然后立即再次选择它 - 你可以看到 SelectionChanged 事件触发了两次.这是示例调试输出:

有人知道发生了什么吗?这种情况下如何取消选中该项?

【问题讨论】:

【参考方案1】:

我假设 UWP 中发生的事件顺序不同。像这样的:

未选择项目 -> ItemClick 事件处理程序 -> 已选择项目 -> SelectionChanged 事件 -> 其他一些事件 -> 不再有 SelectionChanged 事件,因为该项目已被选择。

Item 被选中 -> ItemClick 事件处理程序 -> Item 未被选中 -> SelectionChanged 事件 -> 其他一些事件 -> SelectionChanged 事件再次触发,因为该项目不再被选中。

这里有一个小窍门来让它发挥作用:

private void myList_ItemClick(object sender, ItemClickEventArgs e)

    Debug.WriteLine("Clicked item");
    ListView list = sender as ListView;
    ListViewItem listItem = list.ContainerFromItem(e.ClickedItem) as ListViewItem;

    if (listItem.IsSelected)
    
        listItem.IsSelected = false;
        list.SelectionMode = ListViewSelectionMode.None;
    
    else
    
        list.SelectionMode = ListViewSelectionMode.Single;
        listItem.IsSelected = true;
    

编辑:多项选择的行为已经按预期工作:第二次单击时取消选择该项目。无需变通方法!

【讨论】:

谢谢。对于单个项目似乎工作 - 我们也可以省略 listItem.IsSelected = false;SelectionMode 的更改将完成这项工作。但是,如果我们要进行多选,这个技巧将无济于事 - 你对这种情况有什么想法吗? @Romasz 当 SelectionMode="Multiple" 时,默认行为已经在第二次单击时取消选择该项目 - 不需要任何技巧。 :) 是的,多选就可以了。我将不得不重新设计一些东西。尽管如此,如果我们无法取消选择 SingleMode 中的项目(除了重置 SelectionMode),IMO 就会出现问题。感谢您的帮助,我会暂时保留这个问题,也许有人能够解释这些事件发生了什么。【参考方案2】:

我不知道这是否是由于更新,但这有效;

 ListViewItem item = listView1.SelectedItems[0];
//Do whatever you need to with item
item.Selected = false;

我遇到了同样的问题,这个页面上的答案引导我尝试上述方法。

【讨论】:

在一段时间内可能发生了一些变化。您是否使用问题中的代码尝试过这个?【参考方案3】:

您可以清除列表视图中的选择

listView1.SelectedItems[0].Focused = false;
listView1.SelectedItems[0].Selected = false;

For further details, check this article how to clear selection inside selectedIndex changed event

【讨论】:

【参考方案4】:

以上方法在 UWP 目标版本 17134 中都不适合我。

我试图在双击时取消选择。最后,我发现了这个:

ctor ()  // wherever you are doing setup
    myList.SelectionMode = ListViewSelectionMode.Extended;
    myList.DoubleTapped += myList_DoubleTapped;
    myList.SelectionChanged += myList_SelectionChanged;


int deselect = 0;
private void myList_DoubleTapped(object sender, Windows.UI.Xaml.Input.DoubleTappedRoutedEventArgs e)

    deselect = (e.PointerDeviceType == PointerDeviceType.Touch) ? 1 : 2;
    MyList.SelectedIndex = -1;


private void myList_SelectionChanged(object sender, SelectionChangedEventArgs e)

    if (deselect > 0)
    
        myList.SelectedIndex = -1;
        deselect--;
    

使用ListViewSelectionMode.Single 不起作用。对deselect 使用bool 标志不起作用。

如果您需要从不在列表视图中的事件中清除选择(例如来自Button):

deselect = 0;
existingPinList.SelectedIndex = -1;

UWP¯\_(ツ)_/¯

【讨论】:

以上是关于如何以编程方式取消选择 ListViewItem?的主要内容,如果未能解决你的问题,请参考以下文章

如何以编程方式取消选择 Datatable 中的选定行

forge Viewer - 如何以编程方式选择 dbId,因为它会自动取消选择其他选择

以编程方式从 Windows Phone 8.1 XAML 中的 ListView 中的特定 ListViewItem 到达 TextBlock

Select2 多选 - 以编程方式取消选择/取消选择项目

如何在kivymd python的MDDataTable中以编程方式取消选中复选框

如何以编程方式重置或取消选中 Angular 中的单选按钮?