I have a ListBox that I bind to an ItemsSource, like this:
var foos = new ObservableCollection<Foo> { foo1, foo2, foo3 };
var listBox = new ListBox { ItemsSource = _foos };
Now I want to do some operations right away on the ListBoxItems that holds the items, but they don’t seem to be created right away. Are they? Is there some event I can listen to in order to be notified, or am I simply trying to fetch the ListBoxItem’s in an invalid way? I am doing it like this (and have verified that it works somewhere I know the ListBox is “ready”):
var lbi = listBox.ItemContainerGenerator.ContainerFromItem(foo1) as ListBoxItem;
Note that this is being done in a unit test, so I guess the ListBox is never rendered. Is that why the ListBoxItems aren’t created? And can I manually trigger the creation of the ListBoxItems somehow?
Items-creation is done async and depending on the panel, it can happen that it is not created at all (virtualization). The event your’re looking for is
ItemContainerGenerator.StatusChanged. Do a google-search for it on SO, you will find many examples. However directly searching and working with the items can get complex.Here is a very good article that discusses the item-creation in detail. Look also for the ancestor-article .
BTW:
I recommend you to look at the MVVM-pattern. While there is a small bit of time you loose learning it (not comparable to the time learnding WPF), it will save you a lot of time. Here you find a link to a video from Jason Dolinger that gives you a great start-point.
Update:
As promised in the comment, here a function to search the visual tree (only usable when virtualization is off).