2

ItemsSourceがアイテムViewModelクラスインスタンスのコレクションに設定されたWPFListViewコントロールがあります。ListViewには、カスタムコントロール階層を持つItemTemplateがあります。

ListViewが実際に表示され(まだ表示されていない場合)、すべてのアイテムがレイア​​ウトされている場合(つまり、安全に使用できる場合)に、ItemTemplateを介して生成されたコントロールに対して特定のことを行う必要がありますItemContainerGenerator.ContainerFromItem

サブスクライブするItemContainerGenerator.StatusChangedと、ステータスがに変わってGeneratorStatus.ContainersGeneratedもジェネレーターにアイテムがありません(?!?ところで)。実行時に既存のコントロールでItemsSourceが変更された場合でも、ListViewがアイテムにバインドされている実際のコントロールを反復処理する準備ができたら、どのように通知できますか?

これで、テンプレート内の実際のコントロールのイベントをサブスクライブできることはわかっていますが、すべてのアイテムコントロールがいつ作成されるかを知る必要があります。アイテムのビューモデルでスタフを実行しても、UI関連を実行する必要があるため、役に立ちません。アニメーションなど。

4

1 に答える 1

4

要するに、そのようなイベントはありません。LayoutUpdatedイベントを使用できる場合がありますが、ListViewが更新されると、このイベントが複数回発生します。

また、仮想化が有効になっている場合、すべてのコンテナーが一度に作成されるわけではないことにも注意してください。

最善の策は、ListViewItemに添付された動作(ここここを参照)を使用することです。これは、暗黙のスタイルを使用して適用できます。

たとえば、デフォルト値がfalseのMyPropertyという名前のブール値が付加されたプロパティを持つMyBehaviorというクラスを作成した場合、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 に答える