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

4

我对这个小问题感到困惑已经有一段时间了。在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上遇到了问题。选择第一个项目可以正常工作,更改也可以,但我无法取消选择项目 - 从调试输出中可以看出,列表视图似乎取消了选择项目,然后立即再次选择它 - 您可以看到SelectionChanged事件触发了两次。以下是示例调试输出:

Debug Output

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

6

我假设在UWP中事件的顺序是不同的。大致如下:

项目未被选择 -> ItemClick事件处理程序 -> 项目被选择 -> SelectionChanged事件 -> 其他事件 -> 因为该项目已被选中,不会再触发SelectionChanged事件。

项目已被选择 -> ItemClick事件处理程序 -> 项目未被选择 -> 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
1
@Romasz 当SelectionMode="Multiple"时,默认行为已经在第二次点击时取消选择该项 - 不需要任何技巧。 :) - Igor Ralic
是的,使用多选功能它可以工作。我将不得不重新设计一些东西。尽管如此,在SingleMode中如果我们无法取消选择该项,则存在问题,而不是重置SelectionMode。感谢您的帮助,我会把这个问题保持开放一段时间,也许有人能够解释这些事件的原因。 - Romasz

1
我不知道这是由于更新引起的,但这个可以运行;
 ListViewItem item = listView1.SelectedItems[0];
//Do whatever you need to with item
item.Selected = false;

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


在这段时间里可能发生了一些变化。你是否尝试过使用问题中的代码来解决? - Romasz

0

0

以上方法都无法在针对构建版本17134的UWP中为我工作。

我试图在双击时取消选择。最终,我找到了这个:

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 无效。使用 deselectbool 标志也无效。

如果你需要清除选择项,但事件不在列表视图上(例如从一个 Button),请执行以下操作:

deselect = 0;
existingPinList.SelectedIndex = -1;

UWP ¯\_(ツ)_/¯


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接