WPF ListView - Событие, когда элемент управления готов для перебора отображаемых элементов?
У меня есть элемент управления WPF ListView с ItemsSource, установленным в коллекцию экземпляров класса ViewModel элемента. ListView имеет ItemTemplate с пользовательской иерархией управления.
Мне нужно сделать определенные вещи с теми элементами управления, сгенерированными с помощью ItemTemplate, когда фактически отображается ListView (если он еще не виден) и все его элементы размечены (т.е. когда это безопасно для использования ItemContainerGenerator.ContainerFromItem
).
Если я подпишусь на ItemContainerGenerator.StatusChanged
когда статус меняется на GeneratorStatus.ContainersGenerated
в генераторе до сих пор нет предметов (?!? кстати). Как я могу получить уведомление, когда ListView готов к итерации по фактическим элементам управления, которые связаны с элементами, даже когда ItemsSource изменяется во время выполнения на существующем элементе управления?
Теперь я знаю, что могу подписаться на события фактического элемента управления в шаблоне, но мне нужно знать, когда все элементы управления созданы, выполнение stuf в viewmodel элемента не помогает мне, так как мне нужно сделать связанный с пользовательским интерфейсом такие вещи, как анимация и т. д.
1 ответ
Короче, такого события нет. Вы можете использовать событие LayoutUpdated, но оно вызывается более одного раза при обновлении ListView.
Помните также, что если виртуализация включена, то не все контейнеры будут созданы одновременно.
Лучше всего было бы использовать прикрепленное поведение (см. Здесь и здесь) для ListViewItem, которое вы можете применить, используя неявный стиль.
Например, если вы создали класс MyBehavior с логическим вложенным свойством MyProperty со значением по умолчанию, равным false, тогда стиль будет выглядеть примерно так:
<ListView ...>
<ListView.Resources>
<Style TargetType="ListViewItem">
<Setter Property="local:MyBehavior.MyProperty" Value="True" />
</Style>
</ListView.Resources>
</ListView>
Когда для вашего свойства установлено значение true, вы знаете, что ListViewItem создан и должен быть готов к визуализации. Если нет, вы можете присоединиться к событию Loaded, чтобы узнать, когда выполнять свою работу.