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

时间:2015-10-21 13:44:29

标签: c# listview windows-10 uwp windows-10-mobile

我对这个小问题感到困惑了一段时间。 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 事件被触发两次。以下是示例调试输出:

Debug Output

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

4 个答案:

答案 0 :(得分:4)

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

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

选择了项目 - &gt; ItemClick事件处理程序 - &gt;未选择项目 - &gt; SelectionChanged事件 - &gt; 其他一些事件 - &gt;在不再选择项目时,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;
    }
}

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

答案 1 :(得分:1)

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

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

我遇到了同样的问题,本页的答案引导我尝试以上内容。

答案 2 :(得分:0)

答案 3 :(得分:0)

以上内容均不适用于以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不起作用。为bool使用deselect标志无效。

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

deselect = 0;
existingPinList.SelectedIndex = -1;

UWP ¯\_(ツ)_/¯