WPF воссоздает все ваши UserControls каждый раз, когда изменяется сортировка, поэтому я предполагаю, что что-то в создании этих элементов управления идет медленно. Но это только предположение.
Вы должны начать с сужения проблемы. Вот несколько шагов, которые вы можете предпринять:
Узнайте, какая операция занимает 3-4 секунды. Вы не указали, происходит ли задержка только при назначении значения пользовательской сортировке или каждый раз, когда список изменяется после установки пользовательской сортировки. Это имеет значение.
Попробуйте добавить обычный текстовый столбец и отсортировать по нему, используя встроенную сортировку, чтобы увидеть, быстро это или нет. Возможно, вы уже сделали это, но вы не сказали в своем вопросе.
В целях диагностики временно остановите настройку CustomSort и установите вместо нее ListCollectionView.Filter. Установите для него фильтр, который всегда возвращает true. Если вы все еще получаете замедление, проблема связана с попыткой ListCollectionView реорганизовать элементы.
Временно отредактируйте ваши шаблоны и замените пользовательские элементы управления UserControl чем-то тривиальным (например, <CheckBox/>
), чтобы увидеть, ускоряется ли ситуация.
Установите точки останова в конструкторах ваших UserControls, чтобы увидеть, вызывается ли их ожидаемое количество раз (т.е. 10 вызовов конструктора, если в списке 10 элементов). Если их вызывают больше раз, чем ожидалось, посмотрите на трассировку стека, чтобы увидеть, откуда поступают дополнительные вызовы.
Добавьте код в ваши конструкторы UserControl для записи DateTime. Теперь конструкторы были вызваны в окно вывода (или журнал, или что-то еще). Это даст вам некоторое представление о том, сколько времени занимает каждый.
Добавьте несколько сотен элементов в ObservableCollection, запустите ваше приложение бок о бок с VS.NET, нажмите кнопку сортировки (или любую другую), затем нажмите кнопку «Разбить все» в VS.NET и посмотрите на трассировки стека. Нажмите «Продолжить» и немедленно нажмите «Разбить все», затем снова посмотрите на трассировку стека Повторите много раз. Это даст вам хорошее представление о том, что занимает все дополнительное время.
Если, как я подозреваю, проблема заключается в медленном создании и привязке UserControls, вы обнаружите: проблема возникает при каждом изменении списка, а также происходит при смене фильтра, вещи ускоряются при замене пользовательских контроллеров на <CheckBox/>
ваш конструктор будет вызываться только один раз для каждого элемента, время между вызовами будет большим.
Обратите внимание, что я не говорю, что это конструктор UserControls, который работает медленно - возможно, что UserControl создает множество дочерних объектов, когда он связан с данными, или что он включает объекты которые являются медленными или сложными, подобъект загружает файл или множество других возможных причин. Суть в том, что создание экземпляра DataTemplate объекта и добавление его в визуальное дерево делает что-то медленное. Следы стека должны дать вам представление, где искать.
Если это окажется чем-то другим или вы не можете понять это, просто обновите свой вопрос, чтобы дать больше информации о том, что показали вышеуказанные тесты, и мы постараемся вам помочь.