Отслеживание изменения выделения в ListView

Нужно отследить изменение выделения элементов списка.
Если так:

        private void listViewChunks_SelectedIndexChanged(object sender, EventArgs e)
        {
            System.Diagnostics.Debug.WriteLine(listViewChunks.SelectedItems.Count);
        }

то работает как-то неадекватно. При переключении элементов, срабатывает два раза подряд и выдаёт сначала 0, потом 1.
А если выделить сразу несколько элементов кучей, выдаёт

0
1
2
3
4
....

и т.д., сколько элементов было выделено.
Ещё есть такое событие:

Но с ним точно так же.

Простите, перепутал. Мне нужен ListView, а я сначала написал ListBox. Исправил.

Работает как задумано. У элемента с которого фокус уходит меняется состояние, он становится невыбранным. У элемента, на который приходит фокус, меняется состояение, он становится выбранным.

Странно у них задумано :thinking: Если выделить разом 10000 элементов, то обработчик сработает 10000 раз, а не один.

Ну всё правильно, ты выделил 10000 элементов. Каждый из элементов поменял состояние. Это произошло 10000 раз.

̶Н̶е̶ ̶н̶р̶а̶в̶и̶т̶с̶я̶ ̶-̶ ̶н̶а̶п̶и̶ш̶и̶ ̶с̶в̶о̶й̶ ̶к̶о̶н̶т̶р̶о̶л̶.̶

Если выделил по очереди - правильно. Если одновременно - так себе идея :man_shrugging:

Опять эта старая песня :man_facepalming: Косячут высокооплачиваемые специалисты, а исправлять бесплатному мне.

А ты не используй фреймворк которому 20 лет. Используй новый модный современный.

Да эт понятно. Я всё никак времени не найду.

you can utilize the Dispatcher class in WPF. The Dispatcher provides a way to schedule the execution of code on the UI thread, allowing you to defer the execution of your code until after all the selection events have been processed.

The DispatcherPriority.ApplicationIdle parameter ensures that the code is executed when the application is idle and all pending UI events, including selection events, have been processed.

By using the Dispatcher class, you can defer the execution of your code until after all the selection events have been fired, effectively reacting to the last event instead of the first event.


In Windows Forms, you can achieve a similar approach without using a timer by utilizing the Application.Idle event. The Application.Idle event is raised when the message queue is empty and the application is idle. Here’s an example of how you can implement it:

private void listView1_SelectedIndexChanged(object sender, EventArgs e)
{
    Application.Idle += Application_Idle;
    // Тут надо подумать происходит добавление один или несколько раз
}

private void Application_Idle(object sender, EventArgs e)
{
    Application.Idle -= Application_Idle;
    // Your code logic here
    // This will execute after all the selection events have been processed
}