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?