2009-07-06 14 views
4

Y a-t-il un moyen de déclencher l'événement selectionchanged chaque fois que l'on clique sur une sélection dans la liste, et non seulement quand elle change? Par exemple, disons que j'ai une listview avec un seul objet dans celle-ci. L'utilisateur clique sur cet objet et cet objet contient des informations qui remplissent certaines zones de texte ci-dessous. L'utilisateur commence à modifier certaines valeurs dans ces zones de texte (qui ne sont pas liées à l'objet). Ils décident alors qu'ils ne veulent pas de ce qui se trouve dans ces zones de texte, ils aimeraient donc tout réinitialiser à ce qui est dans l'objet dans la liste. Mais quand ils cliquent sur l'un des objets dans la liste, rien ne se passe, car la sélection n'a pas changé.listview.selectionchanged, puis-je le déclencher à chaque fois que je clique sur un élément?

Espérons que cela a du sens. Quelqu'un sait comment je peux contourner cela?

Répondre

5

Les événements ListView.SelectionChanged et ListViewItem.Selected ne seront pas réactivés si l'élément est déjà sélectionné. Si vous avez besoin de le relancer, vous pouvez "désélectionner" l'élément lorsque l'événement se déclenche.

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

Vous permettant ainsi de le resélectionner ad nauseum. Cependant, si vous n'avez pas besoin de la sélection réelle, vous devriez utiliser un ItemsControl.

Si vous souhaitez conserver la sélection des éléments, vous devez vous enregistrer auprès d'un événement différent de ListView.SelectionChanged ou ListView.Selected. Celui qui fonctionne bien pour cela est PreviewMouseDown, tout comme la sélection initiale des éléments que nous voulons qu'il se produise sur les clics gauche et droit. Nous pourrions l'attacher au seul ListViewItem, mais comme la liste peut à un moment donné gagner plus d'éléments, nous pouvons l'assigner à tous les éléments en utilisant la propriété ItemContainerStyle de 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); 
} 
1
private void ListView_SelectionChanged(object sender, SelectionChangedEventArgs e) 
    { 
     if(ListView.SelectedIndex != -1) 
     { 
     //to do staff 
     } 
     ListView.SelectedIndex = -1; 
} 

nous pouvons aussi utiliser celui-ci!

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

et dans le code derrière

private void UIElement_OnTapped(object sender, TappedRoutedEventArgs e) 
    { 
      //this fire every time 
    } 
+0

Bien que ce code peut répondre à la question, en fournissant étoffent pourquoi et/ou comment ce code répond à la question d'améliorer sa valeur à long terme. – ryanyuyu

+0

@ryanyuyu je trouve aussi de cette façon, j'espère que c'est aidé – FatemehEbrahimiNik