2009-04-28 4 views
3

J'utilise un ListView pour afficher la liste des erreurs qui se produisent dans mon application. Il se comporte et ressemble exactement à la liste d'erreurs dans Visual Studio. Je veux ajouter le défilement automatique lorsque le dernier élément d'erreur est sélectionné (comme la manière dont la fenêtre de journal de Visual Studio défile automatiquement lorsque vous placez le curseur à la fin).Quel est le meilleur moyen de faire défiler automatiquement une vue de liste vers le dernier élément ajouté?

La liste des erreurs est dans un ObservableCollection, qui est passé à la ListView.ItemsSource comme ceci:

public ObservableCollection<ErrorListItem> Items; 
... 
MyListView.ItemsSource = _Items; 

J'ai essayé d'effectuer le défilement automatique dans le gestionnaire d'événements _Items_CollectionChanged, mais parce que c'est l'événement sur la ItemsSource et pas sur le ListViewItems réel, c'est une douleur à comprendre si le dernier élément est sélectionné, sélectionnez la nouvelle ligne, etc. C'est particulièrement difficile car il semble que le ListViewItems ne sont pas créés instantanément. J'ai réussi à faire défiler automatiquement en retardant l'appel pour définir le dernier élément sélectionné comme ceci:

void _Items_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e) 
{ 
    // determine the last item to select from 'e' 
    ...   

    _ItemPendingToBeScrolled = newItemToSelect; 
    ListView.SelectedItem = newItemToSelect; 


    Dispatcher.BeginInvoke(DispatcherPriority.Background, 
     (ThreadStart)delegate 
     { 
      if (_ItemPendingToBeScrolled != null) 
      { 
       ListView.ScrollIntoView(_ItemPendingToBeScrolled); 
       ItemPendingToBeScrolled = null; 
      } 
     }) 
} 

Mais c'est évidemment pas la bonne façon de le faire. En outre, je veux que les choses continuent à fonctionner si la liste est filtrée (ne vérifiant pas le dernier élément dans ma source, mais le dernier ListViewItem dans le ListView).

Existe-t-il un moyen d'écouter les événements lorsqu'un ListViewItem est ajouté au ListView suite à un ajout à la collection liée? Ce serait l'événement idéal pour capturer correctement mon auto-défilement. Ou y a-t-il une autre technique que je pourrais utiliser?

Répondre

0

J'ai beaucoup de problèmes avec les listboxes/listviews et leur défilement, cependant, vous avez mentionné hooker à l'événement changé de listview, est-ce parce que vous ne pouvez pas écouter l'événement CollectionChanged de la collection observable? ObservableCollection est bien plus stable que les contrôles List, et vous obtiendrez les mêmes notifications. Vous pouvez également faire grimper ces événements si cela ne fonctionne pas dans l'interface utilisateur et vous n'avez pas accès, de cette façon vous traitez votre défilement dans l'interface utilisateur sans avoir accès à la collection réelle, gardez juste une référence à la sélection Élément de la classe EventArgs personnalisée

Questions connexes