Pergunta

Existe uma maneira de fazer o fogo evento SelectionChanged cada vez que uma seleção na listview é clicado, ao invés de somente quando ela muda?

Por exemplo, digamos que eu tenho um listview com apenas um objeto na mesma. O usuário clica nesse objeto e esse objeto contém informações que preenche algumas caixas de texto abaixo. O utilizador começa a mudar alguns dos valores nestas caixas de texto (que não estão ligadas ao objecto). Eles, então, decidir que eles não querem o que é nessas caixas de texto para que gostaria de repor tudo o que está no objeto na listview. Mas quando eles clique o objeto no listview, nada acontece, porque a seleção não mudou.

A esperança que faz sentido. Alguém sabe como posso resolver isso?

Foi útil?

Solução

Os eventos ListView.SelectionChanged e ListViewItem.Selected não vão re-fogo se o item já está selecionado. Se você precisa re-fogo, você poderia 'desmarcar' o item quando o evento é acionado.

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

Assim, o que lhe permite voltar a selecioná-lo ad nauseum. No entanto, se você não precisa a seleção real, então você deve estar usando um ItemsControl .

Se você quiser manter a select-capacidade do item (s), então você deve olhar para registrar a um evento diferente do que ListView.SelectionChanged, ou ListView.Selected. Um que funcione bem para isso é PreviewMouseDown, como como a seleção item inicial queremos que ocorrem em ambos os cliques esquerdo e direito. Poderíamos anexá-lo ao único ListViewItem, mas desde que a lista pode em algum ponto ganho mais itens, podemos atribuí-la a todos os itens usando a propriedade ItemContainerStyle do ListView.

<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);
}

Outras dicas

private void ListView_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
       if(ListView.SelectedIndex != -1)
         {
         //to do staff
         }
       ListView.SelectedIndex = -1;
 }

também podemos usar este!

 <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>

e no código por trás

  private void UIElement_OnTapped(object sender, TappedRoutedEventArgs e)
   {   
           //this fire every time 
   }
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top