Domanda

C'è un modo per rendere l'evento fuoco SelectionChanged ogni volta una selezione nel listview viene cliccato, anziché soltanto quando cambia?

Per esempio, Diciamo che ho un ListView con un solo oggetto in esso. L'utente seleziona l'oggetto e quell'oggetto contiene informazioni che popola qualche campo di testo sottostante. L'utente inizia a cambiare alcuni dei valori in questi textboxes (che non sono vincolati all'oggetto). Hanno poi decidono che essi non vogliono ciò che è in quelle caselle di testo in modo che vorrebbero azzerare tutto a ciò che è nell'oggetto nella ListView. Ma quando si fa clic l'unico oggetto in ListView, non succede nulla, perché la selezione non è cambiata.

La speranza che abbia un senso. Qualcuno sa come posso ottenere intorno a questo?

È stato utile?

Soluzione

Gli eventi ListView.SelectionChanged e ListViewItem.Selected non stanno andando a ri-fuoco se l'elemento è già selezionata. Se avete bisogno di ri-fuoco, si potrebbe 'deselect' la voce quando l'evento.

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

In questo modo consente di riselezionare fino alla nausea. Tuttavia, se non è necessario il selezione vera e propria, allora si dovrebbe utilizzare un ItemsControl .

Se si vuole mantenere la select-capacità della voce (s), allora si dovrebbe guardare la registrazione di un evento diverso da quello ListView.SelectionChanged o ListView.Selected. Uno che funziona bene per questo è PreviewMouseDown, come come la selezione iniziale oggetto vogliamo che si verifichi su entrambi i click sinistro e destro. Potremmo attaccarlo al singolo ListViewItem, ma dal momento che l'elenco può ad un certo punto ottenere più articoli, possiamo assegnarlo a tutti gli elementi utilizzando la proprietà ItemContainerStyle del 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);
}

Altri suggerimenti

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

anche possiamo usare questo!

 <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 nel codice dietro

  private void UIElement_OnTapped(object sender, TappedRoutedEventArgs e)
   {   
           //this fire every time 
   }
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top