2010-07-16 8 views
3

J'ai un listview (en mode de sélection étendu et synchronisé avec l'élément actuel) et une zone de texte. La zone de texte permet à l'utilisateur d'entrer des critères de recherche. Sur l'événement TextChanged de la zone de liste, je fais correspondre les critères de recherche avec les noms de listviewitems dans la listview et définissez l'index selected en conséquence. Ceci est à la fois mettre en évidence et fournir un point de sélection facile pour sélectionner d'autres points. Voir le code ci-dessous:Problème de sélection de la liste WPF

void searchTextBox_TextChanged(object sender, TextChangedEventArgs e) 
    { 
     try 
     { 
      TextBox textBox = (TextBox)sender; 
      if (textBox != null) 
      { 
       string text = textBox.Text; 
       if (text != string.Empty) 
       { 
        for (int i = 0; i < listViewPerson.Items.Count; i++) 
        { 
         Person person = (Person)listViewPerson.Items[i]; 
         if (person != null) 
         { 
          if (person .Name.StartsWith(text, StringComparison.OrdinalIgnoreCase)) 
          { 
           listViewPerson.SelectedIndex = i; 
           listViewPerson.ScrollIntoView(routePoint); 
           break; 
          } 
         } 
        } 
       } 
       else 
       { 
        listViewPerson.SelectedIndex = -1; 
       } 
      } 
     } 
     catch (Exception Caught) 
     { 
      Log.AddExceptionEntry(this, "Could not search ", Caught, Log.Target.All, 
       Log.EntryType.Error); 
     } 
    } 

La recherche et la sélection fonctionnent très bien. Lors de la première tentative, l'utilisateur peut sélectionner un deuxième point (le premier est déjà sélectionné par la recherche) et sélectionner plusieurs fois le premier sans problème. Cependant, pour la deuxième fois, la liste continue de mémoriser le premier point sélectionné à partir de la première recherche (qui a été initialement définie par la routine de recherche), ce qui fait que la sélection commence au mauvais endroit (même si l'index sélectionné est correctement défini sur le nouvel élément dans la liste). Cependant, un clic de souris sur l'index sélectionné entraîne la réinitialisation correcte du point de sélection. Il semble que selectedindex fonctionne différemment dans le code par rapport aux clics manuels.

J'ai essayé d'utiliser listViewTrainServiceHelperPattern.SelectedItems.Clear(), SelectedValue (object) au lieu de SelectedIndex, mais en vain. Est-ce que quelqu'un a une idée de ce qui cause et comment contourner cela?

+0

J'ai lu plusieurs fois, mais je suis encore un peu confus au sujet de certaines informations manquantes. Que signifie la sélection d'un second «point», et quelle action ou événement commence la «deuxième fois autour de la liste? Si vous avez sélectionné plusieurs éléments, l'élément 'selectedindex' renvoie le premier index sélectionné, pas l'index sélectionné le plus récemment. Cependant, à partir de votre question, je ne peux pas dire ce qui se passe entre la première fois que votre moteur de recherche fonctionne et le «deuxième tour». Est-ce que tous les éléments sont effacés, exécutez-vous une logique personnalisée ...? – Scott

+0

Qu'est-ce que 'routePoint'? Il semble que cela pourrait vivre à travers les invocations de cet événement. Aussi, ce code ne me semble pas très "MVVM", car il a une logique de vue en code-behind plutôt que dans le modèle de vue. Si vous rencontrez des problèmes lors de la manipulation de 'TextChanged' en temps réel avec MVVM, essayez ceci dans votre liaison:' UpdateSourceTrigger = PropertyChanged' –

+0

Oups, désolé de necro :) –

Répondre

0

Cela ressemble à un bogue Wpf treeview où si vous définissez le IsSelected sur un élément via une liaison, le focus logique reste avec l'élément précédemment sélectionné. Essayez d'obtenir un handle pour le ListViewItem nouvellement sélectionné en utilisant ListView.ItemContainerGenerator.ContainerFromItem (nouvellementSelectedItem), puis appelez le focus() dessus. Je serais vraiment intéressé d'entendre si cela fonctionne pour vous.