ListBox ScrollIntoView при использовании CollectionViewSource с GroupDescription (т.е. IsGrouping == True)

Укороченная версия

Я хотел бы прокрутитьListBox элемент в поле зрения, когда выбор изменяется.

Длинная версия

у меня естьListBox сItemsSource привязан кCollectionViewSource сGroupDescriptionсогласно примеру ниже.

<Window.Resources>
    <CollectionViewSource x:Key="AnimalsView" Source="{Binding Source={StaticResource Animals}, Path=AnimalList}">
        <CollectionViewSource.GroupDescriptions>
            <PropertyGroupDescription PropertyName="Category"/>
        </CollectionViewSource.GroupDescriptions>
    </CollectionViewSource>  
</Window.Resources>

<ListBox x:Name="AnimalsListBox"ItemsSource="{Binding Source={StaticResource AnimalsView}}" ItemTemplate="{StaticResource AnimalTemplate}" SelectionChanged="ListBox_SelectionChanged">
    <ListBox.GroupStyle>
        <GroupStyle HeaderTemplate="{StaticResource CategoryTemplate}" />
    </ListBox.GroupStyle>
</ListBox>

СуществуетSelectionChanged событие в файле с выделенным кодом.

public List<Animal> Animals { get; set; }

private void ListBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    ListBox control = (ListBox)sender;
    control.ScrollIntoView(control.SelectedItem);
}

В настоящее время. Если я установлюAnimalsListBox.SelectedItem к элементу, который в настоящее время не виден, я хотел бы иметь его прокрутки в поле зрения. Вот где это становится сложно, так какListBox быть группами (IsGrouped свойствоtrue) призыв кScrollIntoView выходит из строя.

System.Windows.Controls.ListBox черезрефлектор, Обратите вниманиеbase.IsGrouping вOnBringItemIntoView.

public void ScrollIntoView(object item)
{
    if (base.ItemContainerGenerator.Status == GeneratorStatus.ContainersGenerated)
    {
        this.OnBringItemIntoView(item);
    }
    else
    {
        base.Dispatcher.BeginInvoke(DispatcherPriority.Loaded, new DispatcherOperationCallback(this.OnBringItemIntoView), item);
    }
}

private object OnBringItemIntoView(object arg)
{
    FrameworkElement element = base.ItemContainerGenerator.ContainerFromItem(arg) as FrameworkElement;
    if (element != null)
    {
        element.BringIntoView();
    }
    else if (!base.IsGrouping && base.Items.Contains(arg))
    {
        VirtualizingPanel itemsHost = base.ItemsHost as VirtualizingPanel;
        if (itemsHost != null)
        {
            itemsHost.BringIndexIntoView(base.Items.IndexOf(arg));
        }
    }
    return null;
}

Вопросов

Может кто-нибудь объяснить, почему это такне работать когдас помощью группировка?ItemContainerGenerator.ContainerFromItem всегда возвращаетсяnullдаже если в его статусе указано, что все контейнеры были сгенерированы.Как я могу добиться прокрутки в поле зрения, когдас помощью группировка?

Ответы на вопрос(2)

Ваш ответ на вопрос