2

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

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

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

现在,我知道我可以订阅模板中实际控件的事件,但是我需要知道何时创建了所有项目控件,在项目的视图模型中执行 stuf 对我没有帮助,因为我需要与 UI 相关诸如动​​画之类的东西。

4

1 回答 1

4

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

还要记住,如果启用了虚拟化,则不会一次创建所有容器。

您最好的选择是对 ListViewItem 使用附加行为(参见此处此处),您可以使用隐式样式应用该行为。

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

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

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

于 2011-06-29T11:47:05.017 回答