2009-07-06 250 views
4

是否有一種方法可以在每次點擊列表視圖中的選擇時激發selectionchanged事件,而不是僅當它發生更改時才觸發?listview.selectionchanged,每當我點擊一個項目時,我可以讓它啓動嗎?

例如,假設我有一個只有一個對象的listview。用戶單擊該對象,該對象包含填充下面某些文本框的信息。用戶開始更改這些文本框中的某些值(不綁定到該對象)。然後他們決定他們不需要這些文本框中的內容,所以他們希望將所有內容重置爲列表視圖中對象的內容。但是當他們在列表視圖中單擊一個對象時,沒有任何反應,因爲選擇沒有改變。

希望是有道理的。任何人都知道我能如何解決這個問題?

回答

5

如果項目已被選中,ListView.SelectionChanged和ListViewItem.Selected事件不會重新觸發。如果您需要重新啓動它,則可以在事件觸發時「取消」該項目。

private void ListView_SelectionChanged(object sender, SelectionChangedEventArgs e) 
{ 
    foreach (var item in e.AddedItems.OfType<ListViewItem>()) 
    { 
     Trace.WriteLine("ListViewItem Selected"); 
     item.IsSelected = false; 
    } 
} 

因此,您可以重新選擇它的廣告nauseum。但是,如果您不需要實際選擇,則應該使用ItemsControl

如果您確實想要維護項目的可選能力,那麼您應該查看註冊到不同於ListView.SelectionChanged或ListView.Selected的事件。一個適用於此的PreviewMouseDown就像我們希望它在左右點擊時發生的初始項選擇一樣。我們可以將它附加到單個ListViewItem上,但由於列表可能會在某個時候獲得更多的項目,我們可以使用ListView的ItemContainerStyle屬性將其分配給所有項目。

<ListView SelectionChanged="ListView_SelectionChanged"> 
    <ListView.ItemContainerStyle> 
     <Style TargetType="{x:Type ListViewItem}"> 
      <EventSetter Event="PreviewMouseDown" 
         Handler="ListViewItem_PreviewMouseDown" /> 
     </Style> 
    </ListView.ItemContainerStyle> 
    <ListViewItem>Item 1</ListViewItem> 
    <ListViewItem>Item 2</ListViewItem> 
    <ListViewItem>Item 3</ListViewItem> 
    <ListViewItem>Item 4</ListViewItem> 
</ListView> 


private void ListViewItem_PreviewMouseDown(object sender, MouseButtonEventArgs e) 
{ 
    Trace.WriteLine("ListViewItem Clicked: " + (sender as ListViewItem).Content); 
} 
1
private void ListView_SelectionChanged(object sender, SelectionChangedEventArgs e) 
    { 
     if(ListView.SelectedIndex != -1) 
     { 
     //to do staff 
     } 
     ListView.SelectedIndex = -1; 
} 

我們也可以用這個!

<ListView x:Name="ListView" 
            Height="Auto" SelectionChanged="ListView_OnSelectionChanged" 
            Width="260" 
            Margin="0,-12,0,-25"> 
            <ListView.ItemTemplate> 
             <DataTemplate> 
              <StackPanel> 
               <TextBlock Text="{Binding name_to_show_menu,Mode=TwoWay}" Tapped="UIElement_OnTapped"></TextBlock> 
              </StackPanel> 
             </DataTemplate> 
            </ListView.ItemTemplate> 
           </ListView> 

,並在後面

private void UIElement_OnTapped(object sender, TappedRoutedEventArgs e) 
    { 
      //this fire every time 
    } 
+0

儘管此代碼可以回答這個問題的代碼,提供關於爲什麼和/或如何代碼回答了這個問題提高了其長期價值的其他方面。 – ryanyuyu 2016-01-20 17:06:30

相關問題