如何以编程方式取消选择 ListViewItem?
How to deselect ListViewItem programmatically?
我被这个小问题困扰了一段时间。 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上我遇到了问题。选择第一项工作正常,也可以更改它,但我不能 deselect 一个项目 - listview 似乎(从调试输出)到 deselect 项目,然后立即再次 select -您可以看到 SelectionChanged 事件触发了两次。这是示例调试输出:
有人知道这是怎么回事吗?在这种情况下如何删除select该项目?
我假设 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;
}
}
编辑:多项选择的行为已按预期工作:第二次单击时取消选择该项目。无需解决方法!
我不知道这是否是由于更新所致,但这有效;
ListViewItem item = listView1.SelectedItems[0];
//Do whatever you need to with item
item.Selected = false;
我遇到了同样的问题,此页面上的答案指导我尝试上述方法。
您可以在列表视图中清除选择
listView1.SelectedItems[0].Focused = false;
listView1.SelectedItems[0].Selected = false;
For further details, check this article how to clear selection inside selectedIndex changed event
None 以上在 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 ¯\_(ツ)_/¯
我被这个小问题困扰了一段时间。 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上我遇到了问题。选择第一项工作正常,也可以更改它,但我不能 deselect 一个项目 - listview 似乎(从调试输出)到 deselect 项目,然后立即再次 select -您可以看到 SelectionChanged 事件触发了两次。这是示例调试输出:
有人知道这是怎么回事吗?在这种情况下如何删除select该项目?
我假设 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;
}
}
编辑:多项选择的行为已按预期工作:第二次单击时取消选择该项目。无需解决方法!
我不知道这是否是由于更新所致,但这有效;
ListViewItem item = listView1.SelectedItems[0];
//Do whatever you need to with item
item.Selected = false;
我遇到了同样的问题,此页面上的答案指导我尝试上述方法。
您可以在列表视图中清除选择
listView1.SelectedItems[0].Focused = false;
listView1.SelectedItems[0].Selected = false;
For further details, check this article how to clear selection inside selectedIndex changed event
None 以上在 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 ¯\_(ツ)_/¯