2010-03-22 6 views
6

Ich habe ein ItemsControl in meiner Ansicht, die an eine ObservableCollection von ViewModel gebunden ist. Die Sammlung wird gefüllt und anschließend wird ein Ereignis von VM zur Ansicht ausgelöst (denke an Suchergebnisse und SearchFinished-Ereignis).WPF ItemsControl - Wie kann ich wissen, wann die Artikel geladen wurden, damit ich den ersten Fokus setzen kann?

Ich möchte Tastaturfokus auf das erste Element in einem ItemsControl verschieben, aber wenn ich es in Views Code-behind bei der Verarbeitung von SearchFinished tun, werden die Elemente noch nicht gerendert (die Sammlung ist bereits gefüllt, aber wpf ist Rendering) asynchron und ist noch nicht geschehen), also gibt es nichts zu fokussieren (Focus() muss den visuellen Baum der Elemente bereits erstellt haben).

Ich wollte (myItemsControl.ItemContainerGenerator.ContainerFromIndex (0) als UIElement) .Focus() ;, aber da das 0. Element noch nicht geladen ist, gibt ContainerFromIndex (0) null zurück.

Ich habe versucht, es mit Dispatcher.BeginInvoke ... mit niedriger Priorität zu verzögern, aber das ist abhängig von genauem Timing und in der Regel nicht funktioniert.

Wie kann ich warten, bis das erste Element in ItemsControl geladen ist?

Antwort

8

Sie können das Ereignis ItemContainerGenerator.StatusChanged verwenden und dann die Eigenschaft Status überprüfen. Wenn die Status == GeneratorStatus.ContainersGenerated, dann können Sie sicher den ersten Container bekommen.

+0

Danke, das funktioniert perfekt! –