Текущая позиция прокрутки WPF Combobox не меняется

У меня есть общедоступное свойство типа ObservableCollection<ClassName> в коде позади файла, и я привязал его к свойству ItemsSource поля со списком.

<ComboBox Height="23" 
                  Margin="82,34,71,0" 
                  Name="comboBox1" 
                  VerticalAlignment="Top"
                  ItemsSource="{Binding Path=Collection}"
                  DisplayMemberPath="Name" />

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

Теперь я нажимаю кнопку, которая добавит еще один элемент в коллекцию, и я хочу установить курсор в начало списка. Для этого я попробовал следующий код,

    private void button1_Click(object sender, RoutedEventArgs e)
    {
        Collection.Add(new TempObject() { Name = "new item" });
        comboBox1.SelectedIndex = -1;
    }

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

Помогите, пожалуйста....

После применения BringIntoView:

 private void button1_Click(object sender, RoutedEventArgs e)
        {
            Collection.Clear();
            Collection.Add(new TempObject() { Name = "testItem" });
            Collection.Add(new TempObject() { Name = "testItem" });
            Collection.Add(new TempObject() { Name = "testItem" });
            Collection.Add(new TempObject() { Name = "testItem" });
            Collection.Add(new TempObject() { Name = "testItem" });
            Collection.Add(new TempObject() { Name = "testItem" });
            Collection.Add(new TempObject() { Name = "testItem" });
            Collection.Add(new TempObject() { Name = "testItem" });
            Collection.Add(new TempObject() { Name = "testItem" });
            Collection.Add(new TempObject() { Name = "testItem" });
            Collection.Add(new TempObject() { Name = "testItem" });
            Collection.Add(new TempObject() { Name = "testItem" });

            comboBox1.SelectedIndex = -1;

            ComboBoxItem item = comboBox1.ItemContainerGenerator.ContainerFromIndex(0) 
                                                                       as ComboBoxItem;

            if (item != null) item.BringIntoView();
     }

Это всегда будет возвращать значение null для элемента ComboBoxItem.


person Deshan    schedule 31.08.2010    source источник


Ответы (2)


Попробуй это:

comboBox1.Items[0].BringIntoView();
person onof    schedule 31.08.2010
comment
Метод BringIntoView предназначен для объектов типа FrameworkElement. Могу ли я использовать это для элементов пользовательского типа? - person Deshan; 31.08.2010

Под «я хочу установить курсор в начало списка» вы имеете в виду, что хотите установить выбранный элемент выпадающего списка на первый элемент? Затем установите для него индекс 0, индекс -1 означает отсутствие выбора.

private void button1_Click(object sender, RoutedEventArgs e) 
{ 
    Collection.Add(new TempObject() { Name = "new item" }); 
    comboBox1.SelectedIndex = 0; 
} 

Обновление после вашего комментария: поскольку ваше поле со списком привязано к данным, вы можете использовать ItemContainerGenerator, чтобы перейти к первому элементу. Это будет работать только в том случае, если элементы уже были отрисованы, то есть раскрывающийся список был открыт.

private void button1_Click(object sender, RoutedEventArgs e)  
{  
   Collection.Add(new TempObject() { Name = "new item" });  
   comboBox1.SelectedIndex = -1;  
   ComboBoxItem item = comboBox1.ItemContainerGenerator.ContainerFromIndex(0) as ComboBoxItem;
   if (item != null) item.BringIntoView();
}  

Другим более простым способом было бы просто выбрать первый элемент, а затем отменить его выбор.

private void button1_Click(object sender, RoutedEventArgs e)  
{  
    Collection.Add(new TempObject() { Name = "new item" });  
    comboBox1.SelectedIndex = 0;  
    comboBox1.SelectedIndex = -1;  
}
person Wallstreet Programmer    schedule 31.08.2010
comment
Нет. Я не хочу выбирать какой-либо элемент. Выбранный элемент должен быть нулевым. Просто хочу установить положение прокрутки в начало раскрывающегося списка. - person Deshan; 01.09.2010
comment
Большое спасибо за ответы. Но использование ItemContainerGenerator работает нормально, пока связанный список не будет повторно создан. Например, если я повторно создаю экземпляр или очищаю и снова добавляю элементы в коллекцию, ContainerFromIdex возвращает значение null. Поэтому метод BringIntoView не будет работать. Любое обходное решение для этого? - person Deshan; 02.09.2010
comment
Это действительно проблема здесь? Если вы удалите весь элемент, я ожидаю, что положение прокрутки также будет сброшено, поэтому нет необходимости получать первый элемент для вызова BringIntoView. Что вы имеете в виду под восстановлением? Пожалуйста, добавьте к своему вопросу код, который показывает проблемы, с которыми вы столкнулись. - person Wallstreet Programmer; 02.09.2010
comment
Извините, что не опубликовал код. См. вопрос После применения раздела BringIntoView для кода, связанного с проблемой Collection.Clear(). - person Deshan; 03.09.2010