listview.selectionchanged,我每次点击一个项目都能点火吗?

时间:2009-07-06 21:34:32

标签: c# wpf listview selectionchanged

有没有办法在每次点击列表视图中的选项时触发selectionchanged事件,而不是仅在它更改时触发?

例如,假设我有一个只包含一个对象的列表视图。用户单击该对象,该对象包含填充下面某些文本框的信息。用户开始更改这些文本框中的某些值(未绑定到对象)。然后他们决定他们不想要那些文本框中的内容,因此他们想要将所有内容重置为listview中对象中的内容。但是当他们点击列表视图中的一个对象时,没有任何反应,因为选择没有改变。

希望这是有道理的。有谁知道我怎么能绕过这个?

2 个答案:

答案 0 :(得分: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;
    }
}

因此,您可以重新选择它。但是,如果您不需要实际选择,那么您应该使用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 :(得分: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 
   }