Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to control the scroll position of a ListBox in a MVVM WPF app

I have got a big ListBox with vertical scrolling enabled, my MVVM has New and Edit ICommands. I am adding new item to the end of the collection but I want the scrollbar also to auto position to the End when I call my MVVM-AddCommand. I am also making an item editable(By calling EditCommand with a particular row item) from some other part of the application so that my ListBoxItem getting in to edit mode using DataTrigger, but how will I bring that particular row(ListBoxItem) to the view by adjusting the scroll position.

If I am doing it in the View side I can call listBox.ScrollInToView(lstBoxItem). But what is the best way to solve this common Scroll issue from an MVVM perspective.

like image 232
Jobi Joy Avatar asked Feb 18 '10 21:02

Jobi Joy


1 Answers

I typically set IsSynchronizedWithCurrentItem="True" on the ListBox. Then I add a SelectionChanged handler and always bring the selected item into view, with code like this:

    private void BringSelectionIntoView(object sender, SelectionChangedEventArgs e)     {         Selector selector = sender as Selector;         if (selector is ListBox)         {             (selector as ListBox).ScrollIntoView(selector.SelectedItem);         }     } 

From my VM I can get the default collection view and use one of the MoveCurrent*() methods to ensure that the item being edited is the current item.

CollectionViewSource.GetDefaultView(_myCollection).MoveCurrentTo(thisItem); 

NOTE: Edited to use ListBox.ScrollIntoView() to accomodate virtualization

like image 174
Dr. WPF Avatar answered Sep 22 '22 14:09

Dr. WPF