listview.selectionchanged, eu posso fazer isso fogo toda vez que eu clicar em um item?
-
23-08-2019 - |
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?
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
}