Как получить ListBoxItem для элемента в ListBox на «время привязки» - PullRequest
2 голосов
/ 09 сентября 2010

У меня есть ListBox с объектами Foo, и на основании некоторых событий я отключаю / включаю ListBoxItems в ListBox.Используя свойство ListBox.Items, я нахожу объекты Foo, и из того, что я понял, мне нужно использовать следующую функцию, чтобы получить контейнер ListBoxItem для Foo.Правильный?

foreach (var item in Items)
{
    var lbi = ItemContainerGenerator.ContainerFromItem(foo) as ListBoxItem;
    // do something
}

На самом деле у меня есть пользовательский элемент управления FilteringListBox, который наследует ListBox и добавляет к нему дополнительное свойство.Приведенный выше код находится в коде пользовательского элемента управления и прекрасно работает, когда завершается создание FilteringListBox.Моя проблема, однако, заключается в том, что я пытаюсь сделать это, когда какое-то свойство связано.У меня есть свойство FilteringCollection и PropertyCallback срабатывает, когда это связано.В этом обратном вызове я буду хранить FilteringCollection, но я также сделаю начальную фильтрацию - прогоняю коллекцию множеств и отключу любой ListBoxItem, представляющий Foo, который находится в FilteringCollection.

Здесь у меня проблемы.Я нахожу все Foos, поэтому я проверяю, что установлен ItemSource, но, выполнив ItemContainerGenerator.ContainerFromItem, я получаю значение NULL.Как будто ListBoxItems еще не созданы.Не так ли?Вот мой переплет:

<custom:FilteringListBox ItemsSource="{Binding AvailableFoos}" FilteringCollection="{Binding AlreadyIncludedFoos}"></custom:FilteringListBox>

Итак;либо: Как я могу получить ListBoxItems на «время привязки»?Или - если я не могу;Есть ли какое-то событие, которое я могу переопределить, которое говорит мне, что ListBox завершил создание ListBoxItems?Пробовал Инициализировать без удачи ...

Ответы [ 2 ]

1 голос
/ 13 сентября 2010

На самом деле лучшим решением кажется использование ItemContainerGenerator .Подключите обработчик событий при создании:

ItemContainerGenerator.StatusChanged += ItemContainerGenerator_StatusChanged;

И заставьте обработчик событий делать то, что нужно сделать:

protected void ItemContainerGenerator_StatusChanged(object sender, System.EventArgs e)
{
    if (ItemContainerGenerator.Status == GeneratorStatus.ContainersGenerated)
        EvaluateInitialElements(); 
}
0 голосов
/ 09 сентября 2010

Событие OnRender инициируется, когда компонент готов к визуализации, и, следовательно, создаются элементы ListBoxItem. Первоначальная обработка фильтрации этого события, кажется, гарантирует, что все, что мне нужно, готово. Я оцениваю и отключаю элементы, а затем запускаю рендеринг:

protected override void OnRender(System.Windows.Media.DrawingContext drawingContext)
{
    EvaluateInitialElements();
    base.OnRender(drawingContext);
}
...