WPF — нужно событие, когда VirtualizingStackPanel создает элементы для ListView

Есть ли способ узнать, когда контейнеры будут готовы для ListView?

Подробное объяснение того, что я уже сделал

У меня есть элемент управления ListView, в одном из столбцов которого есть DataTemplate, содержащий элемент управления CheckBox. Я выяснил, как динамически получить доступ к CheckBox, используя объект, к которому привязан ListView.

                ListViewItem lItem = (ListViewItem)ListView.ItemContainerGenerator.ContainerFromItem(trackToHandle);
                CheckBox checkBoxToHandle = FindChild<CheckBox>(lItem, "CheckBox");

Проблема в том, что флажки «сбрасываются» (становятся неотмеченными) всякий раз, когда я прокручиваю слишком далеко или всякий раз, когда я сортирую столбцы. Я понял, что это произошло потому, что VirtualizingStackPanel выплевывал контейнеры только для тех ListViewItems, которые были видны (или почти видны). И поскольку CheckBox находится внутри DataTemplate, определенного в XAML, он выбрасывается каждый раз, когда он выходит из поля зрения. или когда список отсортирован.

Я обошел это, создав отдельный список CheckBoxes и используя фактическое событие CheckBoxes «click», чтобы изменить состояние соответствующего CheckBox в моем списке. Затем сделал небольшой метод, чтобы изменить состояние всех видимых CheckBox всякий раз, когда пользователь прокручивает... в результате он выглядит так, как должен был быть в первую очередь.

За исключением случаев, когда я сортирую столбцы. Я попытался заставить его переделать CheckBoxes (как и раньше) сразу после сортировки столбца, но это не сработало. Я думаю, что он не сразу создает контейнеры после сортировки.

Есть ли способ узнать, когда контейнеры будут готовы для ListView?


person Ryan    schedule 21.10.2010    source источник


Ответы (1)


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

Вся цель VirtualizingStackPanel — уменьшить использование памяти, не создавая ListItem без необходимости.

По сути, вам нужно переместить часть данных флажка подальше от элемента управления.

person benPearce    schedule 21.10.2010
comment
Вау, это сработало очень хорошо. Большое спасибо .. Я пытался сделать все эти дополнительные вещи, и это решило проблему даже без дополнительной строки XAML. Большое спасибо, чувак - person Ryan; 21.10.2010