2011-06-29 11 views
2

ItemsSourceがアイテムViewModelクラスインスタンスのコレクションに設定されたWPF ListViewコントロールがあります。 ListViewにはカスタムコントロール階層を持つItemTemplateがあります。WPF ListView - レンダリングされたアイテムを反復処理する準備が整ったときのイベントですか?

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

ItemContainerGenerator.StatusChangedを購読すると、ステータスがGeneratorStatus.ContainersGeneratedに変更されても、発電機には何も表示されません(?!?btw。)。実際にコントロールがアイテムにバインドされているを繰り返し実行する準備ができているときに、どのように通知することができますか?

は今、私は、テンプレート内実際の制御のイベントにsubcribeことができます知っているが、私は私を助けていない項目ののviewmodelにSTUFをやって、項目のコントロールの全てが作成されたときに知っておく必要がありますアニメーションなどのようなUI関連のものを行う必要があるからです。

答えて

4

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

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

暗黙のスタイルを使用して適用できるListViewItemには、添付された動作(hereおよびhereを参照)を使用するのが最善です。

あなたが偽のデフォルト値でMYPROPERTYという名前のブール添付プロパティでMyBehaviorというクラスを作成した場合、その後、スタイルのようになります。

あなたのプロパティがtrueに設定されている
<ListView ...> 
    <ListView.Resources> 
     <Style TargetType="ListViewItem"> 
      <Setter Property="local:MyBehavior.MyProperty" Value="True" /> 
     </Style> 
    </ListView.Resources> 
</ListView> 

は、 ListViewItemが作成され、レンダリングの準備ができているはずです。そうでない場合は、Loadedイベントにアタッチして、いつ仕事をするかを知ることができます。

+0

添付のビヘイビアでうまくやっていますが、listitemごとに起動するので、それは助けにならないだけでなく、すでにdatatemplate.control.loadedイベントでそれを達成できると思います。私のアニメーション効果はアイテムの数とその順序に依存するので、アイテムのすべて*が読み込まれレイアウトされたときにイベントが必要です。私は各アイテムの 'loaded'を追跡し、ゼロに達するまでカウンタを減らすことができましたが、それは最後の手段になります。 –

関連する問題