WPF Listview SelectionChanged event WPF Listview SelectionChanged event wpf wpf

WPF Listview SelectionChanged event


The listView should not fire the SelectionChange if you only set the ItemsSource property. However if you bind the SelectedIndex property to a property of your dataContext object the selection will move to the index that is specified by the binded property.

this doesn't fires the Selector_OnSelectionChanged event when the page loads:

<ListView SelectionChanged="Selector_OnSelectionChanged"                   ItemsSource="{Binding Path=Items}"                  ></ListView>

but this does:

<ListView SelectionChanged="Selector_OnSelectionChanged"                   SelectedIndex="{Binding Path=SelectedIndexValue}"                  ItemsSource="{Binding Path=Items}"                  ></ListView>

because the SelectedIndex is set to the SelecteIndexValue through binding.

To avoid this and still keep the bindings in your markup set the SelectedIndexValue of your dataContext object to -1 before binding (Before InitializeComponent() is called in your form constructor).

Hope this helps.


thanks for the responses.

When I put a breakpoint on the SelectionChanged event, it breaks proceedings there before the screen is fully loaded. You will also see that the first row is 'selected' afterwards on the list. I am not binding to a SelectedIndexValue as you can see in the code. The DataContext for the list is a ReadonlyCollection

In my SelectionChanged event as you can see I notify other objects to be loaded with data relating to the selected item. I only want this to happen when one is selected but not a default one to be set. I have to of these ListViews representing similar data but on loaded none must have an item selected.

I have noticed that the default Selected index is set to -1 on the properties window for the Listview. I can even set this is code on the List_Loaded event, but by then the first SelectionChanged has happened already.

<ListView PreviewMouseDown="ActiveCasesView_MouseDown" x:Name="ActiveCasesView"                     DataContext="{StaticResource ActiveCasesViewSource}"                     ItemsSource="{Binding}"                     ItemTemplate="{StaticResource CasesItemTemplate}"                     SelectionMode="Single"                     SelectionChanged="ActiveCasesView_SelectionChanged"                     ScrollViewer.CanContentScroll="True"                      ScrollViewer.VerticalScrollBarVisibility="Auto" ></ListView>private void ActiveCasesView_SelectionChanged(object sender, SelectionChangedEventArgs e)    {        if (mouseClicked)            if (e.AddedItems.Count > 0)                App.Messenger.NotifyColleagues(App.MSG_SELECT_ACTIVE_CASE, ((CaseViewModel)ActiveCasesView.SelectedItem).CaseNumber);    }

I added the PreviewMouseDown to set an indicator that I have clicked on the listview in the SelectionChanged event. This does help but I'm not convinced that its the best solution.

ThanksPetrus


I don't know if you still need help with this, but I solved this problem by making a variable that tracks the selectedindex, in my case -- when initially bound it's always 0 so it's a little easier for me to do, however if you inform the viewmodel of the appropriate index, I simply added a

ComboBox box = e.OriginalSource as ComboBox;if (_previousIndex == cb.SelectedIndex) return;//do stuff you need to do with a new SelectedIndex