2015-10-21 71 views
2

我一時難以忍受這個小問題。在W10下的ListView有一些我無法理解的奇怪行爲。舉一個簡單的列表:如何以編程方式取消選擇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我遇到一個問題。選擇第一個項目也可以,也可以更改,但我不能取消選擇一個項目 - 列表視圖似乎(從調試輸出)取消選擇項目,然後再次選擇它 - 你可以看到SelectionChanged事件發射兩次。下面是示例調試輸出:

Debug Output

是否有人知道這是怎麼回事?如何在這種情況下取​​消選擇項目?

回答

3

我假設在UWP中發生事件的順序不同。事情是這樣的:沒有選擇

項目 - >項目單擊事件處理程序 - >選擇項目 - > SelectionChanged事件 - >其他一些事件 - >沒有更多的SelectionChanged事件,該項目已被選中。

Item is selected - > ItemClick event handler - > Item is not selected - > SelectionChanged event - >Some other event - > 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; 
    } 
} 

編輯:對於多重選擇行爲已經按預期工作:該項目上的第二次點擊取消。沒有必要的解決方法!

+0

謝謝你的選擇。對於單個項目似乎工作 - 也可以省略'listItem.IsSelected = false;',* SelectionMode *的更改將完成這項工作。但是,如果我們想要進行多重選擇,這個竅門將無濟於事 - 你對這種情況有什麼想法嗎? – Romasz

+1

@Romasz當SelectionMode =「Multiple」時,默認行爲已經在第二次點擊時取消選擇該項目 - 不需要任何技巧。 :) –

+0

是的,有多個選擇它的作品。我將不得不重新設計幾件事情。不過,如果我們無法取消選擇* SingleMode *中其他重設* SelectionMode *的項目,那麼IMO會出現問題。感謝您的幫助,我會將這個問題留待一段時間,也許有人能夠解釋這些事件正在發生什麼。 – Romasz

1

我不知道這是否是由於更新引起的,但是這是有效的;

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

我遇到了同樣的問題,本頁上的答案引導了我嘗試上述方法。

+0

某些東西在時間可能會發生變化。你是否用這個問題的代碼試過了這個? – Romasz

相關問題