WPF ListView-控件准备在呈现项上进行迭代时发生的事件?

WPF ListView-控件准备在呈现项上进行迭代时发生的事件?,wpf,listview,.net-4.0,itemcontainergenerator,Wpf,Listview,.net 4.0,Itemcontainergenerator,我有一个WPF ListView控件,其中ItemsSource设置为item ViewModel类实例的集合。ListView具有具有自定义控件层次结构的ItemTemplate 当ListView实际显示(如果还不可见)并且它的所有项目都已布局好时(即当可以安全地使用ItemContainerGenerator.ContainerFromItem时),我需要对通过ItemTemplate生成的控件执行某些操作 如果我订阅了ItemContainerGenerator.StatusChange

我有一个WPF ListView控件,其中ItemsSource设置为item ViewModel类实例的集合。ListView具有具有自定义控件层次结构的ItemTemplate

当ListView实际显示(如果还不可见)并且它的所有项目都已布局好时(即当可以安全地使用
ItemContainerGenerator.ContainerFromItem
时),我需要对通过ItemTemplate生成的控件执行某些操作

如果我订阅了
ItemContainerGenerator.StatusChanged
,当状态更改为
GeneratorStatus.ContainerGenerated
时,生成器中仍然没有任何项(??顺便说一句)。当ListView准备在绑定到项的实际控件上进行迭代时,即使在现有控件上的ItemsSource在运行时发生更改,如何通知我


现在,我知道我可以在模板中订阅实际控件的事件,但我需要知道所有项目控件的创建时间,在项目的viewmodel中执行stuf对我没有帮助,因为我需要做与UI相关的事情,如动画等。

简言之,没有这样的事件。您可以使用该事件,但在更新ListView时会多次触发该事件

还请记住,如果启用了虚拟化,则不会同时创建所有容器

最好对ListViewItem使用附加行为(请参见和),可以使用隐式样式应用该行为

例如,如果创建了一个名为MyBehavior的类,该类带有一个名为MyProperty的布尔附加属性,默认值为false,则样式如下:

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


当属性设置为true时,您就知道ListViewItem已经创建,并且应该准备好进行渲染。如果没有,您可以附加到已加载的事件以了解何时执行工作。

附加行为的技巧很好,但它对我没有帮助,因为它会按列表项触发,此外,我认为我已经可以通过datatemplate.control.Loaded事件实现这一点。我需要在加载和布局所有项目时使用事件,因为我的动画效果取决于项目的数量及其顺序。我可以跟踪每个项目的
加载
并减少一些计数器,直到它达到零,但这将是最后的手段。