WPF ListView - 当控件准备好迭代渲染项时的事件?

时间:2011-06-29 09:23:13

标签: wpf listview .net-4.0 itemcontainergenerator

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

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

如果我订阅ItemContainerGenerator.StatusChanged,当状态更改为GeneratorStatus.ContainersGenerated时,生成器中仍然没有项目(?!?btw。)。当ListView准备好迭代绑定到项目的实际控件时,即使在运行时在现有控件上更改ItemsSource时,如何才能进行通知?

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

1 个答案:

答案 0 :(得分:4)

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

请记住,如果启用虚拟化,则不会立即创建所有容器。

您最好的选择是为ListViewItem使用附加行为(请参阅herehere),您可以使用隐式样式应用该行为。

例如,如果您使用名为MyProperty的布尔附加属性创建了一个名为MyBehavior的类,其默认值为false,那么Style将类似于:

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

当您的属性设置为true时,您知道ListViewItem已创建并且应该可以渲染。如果没有,您可以附加到Loaded事件以了解何时开展工作。