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

C# 如何以编程方式取消选择ListViewItem?,c#,listview,windows-10,uwp,windows-10-mobile,C#,Listview,Windows 10,Uwp,Windows 10 Mobile,这个小问题困扰了我一段时间。W10下的ListView有一些奇怪的行为,我无法理解。考虑一个简单的列表: 以及背后的代码: private void myList\u ItemClick(对象发送者,ItemClickEventArgs e) { Debug.WriteLine(“单击项”); ListView list=发送方作为ListView; ListViewItem listItem=list.ContainerFromItem(如ClickedItem)作为ListViewIte

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


以及背后的代码:

private void myList\u ItemClick(对象发送者,ItemClickEventArgs e)
{
Debug.WriteLine(“单击项”);
ListView list=发送方作为ListView;
ListViewItem listItem=list.ContainerFromItem(如ClickedItem)作为ListViewItem;
listItem.IsSelected=!listItem.IsSelected;
}
私有无效myList_SelectionChanged(对象发送者,SelectionChangedEventArgs e)
{
Debug.WriteLine($“Selection changed->Add={e.AddedItems.Count},RemovedItems.Count},当前选中={myList.SelectedItems.Count});
}
上面的代码在W8.1上运行得很好,但是在W10上我遇到了一个问题。选择第一个项目可以正常工作,也可以更改它,但我无法取消选择项目-listview(从调试输出)似乎要取消选择项目,然后立即再次选择它-您可以看到SelectionChanged事件触发两次。以下是示例调试输出:


有人知道发生了什么事吗?在这种情况下如何取消选择项目?

我假设在UWP中发生的事件顺序不同。大概是这样的:

未选择项目->项目单击事件处理程序->项目已选择->选择更改事件->某些其他事件->不再选择更改事件,因为该项目已被选择

项目已选中->项目单击事件处理程序->项目未选中->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;
    }
}

编辑:多重选择的行为已按预期工作:在第二次单击时取消选择该项。不需要任何解决办法

我不知道这是否是由于更新造成的,但这是有效的

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

我遇到了同样的问题,本页上的答案引导我尝试上述操作。

您可以在listview中清除所选内容

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

在UWP目标构建17134中,上述所有方法都不适用于我

我试图在双击时取消选择。最终,我发现:

ctor(){//无论您在哪里进行安装
myList.SelectionMode=ListViewSelectionMode.Extended;
myList.DoubleTapped+=myList\u DoubleTapped;
myList.SelectionChanged+=myList\u SelectionChanged;
}
int取消选择=0;
私有void myList_双击(对象发送方,Windows.UI.Xaml.Input.DoubleTappedRoutedEventArgs e)
{
取消选择=(e.PointerDeviceType==PointerDeviceType.Touch)?1:2;
MyList.SelectedIndex=-1;
}
私有无效myList_SelectionChanged(对象发送者,SelectionChangedEventArgs e)
{
如果(取消选择>0)
{
myList.SelectedIndex=-1;
取消选择--;
}
}
使用
ListViewSelectionMode.Single
不起作用。对
取消选择
使用
bool
标志无效

如果您需要从列表视图之外的事件(例如从
按钮
)中清除所选内容:


UWP
'\_(ツ)_/“

谢谢。因为单个项目似乎有效-我们也可以ommit
listItem.IsSelected=false;
,更改SelectionMode就可以了。但是如果我们想进行多个选择,这个技巧不会有帮助-你知道这种情况吗?@Romasz When SelectionMode=“Multiple”默认行为已经在第二次单击时取消选择该项目-不需要任何技巧。:)是的,通过多次选择它可以工作。我将不得不重新设计一些东西。尽管如此,如果我们不能在除重置SelectionMode之外的SingleMode中取消选择项目,则会出现问题。谢谢你的帮助,我会把这个问题留一段时间,也许有人能够解释这些事件发生了什么。随着时间的推移,一些事情可能已经改变了。你用问题中的代码试过了吗?
deselect = 0;
existingPinList.SelectedIndex = -1;