2011-06-29 4 views
2

У меня есть элемент управления ListView WPF с ItemsSource, установленным в коллекцию экземпляров класса ViewModel. ListView имеет ItemTemplate с настраиваемой иерархией управления.WPF ListView - событие, когда элемент управления готов для итерации над отображаемыми элементами?

Мне нужно сделать некоторые вещи для элементов управления, созданных с помощью ItemTemplate, когда на самом деле отображается ListView (если он еще не виден), и все его элементы выложены (то есть, когда безопасно использовать ItemContainerGenerator.ContainerFromItem).

Если я подписываюсь на ItemContainerGenerator.StatusChanged, то при изменении статуса на GeneratorStatus.ContainersGenerated в генераторе все еще нет элементов (?!? Как я могу быть уведомлен, когда ListView готов для итерации по фактическим элементам управления , которые привязаны к элементам, даже если ItemsSource изменен во время выполнения на существующем элементе управления?

Теперь я знаю, что может subcribe к событиям фактического контроляв шаблоне, но мне нужно знать, когда всех элементов управления элементов созданы, делая Stuf в ViewModel деталь не помогает мне так как мне нужно делать связанные с UI вещи, например анимации и т. д.

ответ

4

Короче говоря, такого события не существует. Возможно, вы сможете использовать событие LayoutUpdated, но это срабатывает более одного раза с обновлением ListView.

Имейте в виду, что если виртуализация включена, то не все контейнеры будут созданы сразу.

Лучше всего использовать приложенное поведение (см. here и here) для ListViewItem, который можно применять с использованием неявного стиля.

Например, если вы создали класс под названием MyBehavior с булевым вложенным свойством с именем MyProperty со значением по умолчанию лжи, то стиль будет что-то вроде:

<ListView ...> 
    <ListView.Resources> 
     <Style TargetType="ListViewItem"> 
      <Setter Property="local:MyBehavior.MyProperty" Value="True" /> 
     </Style> 
    </ListView.Resources> 
</ListView> 

Когда свойство установлено в истинный , вы знаете, что ListViewItem был создан и должен быть готов к рендерингу. Если нет, вы можете прикрепить к событию Loaded, чтобы узнать, когда делать свою работу.

+0

Приятный трюк с приложенным поведением, но он мне не поможет, так как он срабатывает per-listitem, кроме того, я думаю, что я уже могу достичь этого с помощью события datatemplate.control.loaded. Мне нужно событие, когда * все * элементов загружаются и выкладываются, так как мои анимационные эффекты зависят от количества элементов и их порядка. Я мог отслеживать «загруженный» каждый элемент и уменьшать счетчик до тех пор, пока он не достигнет нуля, но это будет последним средством. –

 Смежные вопросы

  • Нет связанных вопросов^_^