2009-07-06 220 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

相关问题