我有一个WPF ListView控件,ItemsSource设置为项目ViewModel类实例的集合。 ListView具有带自定义控件层次结构的ItemTemplate。
当ListView实际显示时(如果尚未显示)并且所有项目都已布局(即可以安全使用ItemContainerGenerator.ContainerFromItem
)时,我需要对通过ItemTemplate生成的控件执行某些操作。 / p>
如果我订阅ItemContainerGenerator.StatusChanged
,当状态更改为GeneratorStatus.ContainersGenerated
时,生成器中仍然没有项目(?!?btw。)。当ListView准备好迭代绑定到项目的实际控件时,即使在运行时在现有控件上更改ItemsSource时,如何才能进行通知?
现在,我知道我可以在模板中订阅实际控件的事件,但是我需要知道何时创建所有项目控件,执行stuf在项目的viewmodel中没有帮助我,因为我需要做与UI相关的东西,比如动画等。
答案 0 :(得分:4)
简而言之,没有这样的事件。您可以使用LayoutUpdated事件,但在更新ListView时会多次触发该事件。
请记住,如果启用虚拟化,则不会立即创建所有容器。
您最好的选择是为ListViewItem使用附加行为(请参阅here和here),您可以使用隐式样式应用该行为。
例如,如果您使用名为MyProperty的布尔附加属性创建了一个名为MyBehavior的类,其默认值为false,那么Style将类似于:
<ListView ...>
<ListView.Resources>
<Style TargetType="ListViewItem">
<Setter Property="local:MyBehavior.MyProperty" Value="True" />
</Style>
</ListView.Resources>
</ListView>
当您的属性设置为true时,您知道ListViewItem已创建并且应该可以渲染。如果没有,您可以附加到Loaded事件以了解何时开展工作。