2015-10-21 3 views
2

Я немного смущен этой маленькой проблемой. ListView под W10 имеет странное поведение, которое я не могу понять. Рассмотрим простой список:Как отменить выбор ListViewItem программно?

<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

Знает ли кто-то, что происходит? Как отменить выбор элемента в этом случае?

ответ

3

Я предполагаю, что в UWP происходит другой порядок событий. Что-то вроде этого:

Товар не выбран -> ItemClick обработчик события -> Item выбрано -> 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; 
    } 
} 

EDIT: Поведение множественного выбора уже работает, как ожидалось: пункт выключенной по второму щелчку. Обходных решений не требуется!

+0

Спасибо. Для одного элемента, похоже, работает - также мы можем опустить «listItem.IsSelected = false;», изменение * SelectionMode * выполнит эту работу. Но этот трюк не поможет, если мы хотим сделать мультивыбор - есть ли у вас какие-либо идеи по этому делу? – Romasz

+1

@Romasz Когда SelectionMode = «Несколько», поведение по умолчанию уже отменяет выбор элемента во втором клике - никаких трюков не требуется. :) –

+0

Да, с несколькими выборами он работает. Мне придется переделать пару вещей. Тем не менее, у IMO есть что-то не так, если мы не можем отменить выбор элемента в * SingleMode * other, который перезаписывает * SelectionMode *. Спасибо за помощь, я оставлю этот вопрос открытым какое-то время, может быть, кто-то может объяснить, что происходит с этими событиями. – Romasz

1

Я не знаю, связано ли это с обновлением, но это работает;

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

Я столкнулся с той же проблемой, и ответ на этой странице привел меня к рассмотрению вышеизложенного.

+0

Возможно, что-то изменилось во времени. Вы пробовали это с кодом вопроса? – Romasz

Смежные вопросы