WPF Combobox当前滚动位置不会改变

时间:2010-08-31 09:55:43

标签: c# wpf combobox

我在代码隐藏文件中有一个ObservableCollection<ClassName>类型的公共属性,我将它绑定到Combobox的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();
     }

这将始终为ComboBoxItem项返回null。

2 个答案:

答案 0 :(得分:1)

试试这个:

comboBox1.Items[0].BringIntoView();

答案 1 :(得分:0)

使用“我想将光标设置到列表的开头”,您是否想要将组合框的选定项目设置为第一项?然后将其设置为索引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;  
}
相关问题