none
WPF如何获得一个combobox里的对象 RRS feed

  • 问题

  • 我现在需要在cs文件中获得每个combobox里的ComboBoxItem对象,并进行一定的设置。

    但ComboBoxItem太多了,无法一一用name来表示每个ComboBoxItem,所以我想知道如何在cs文件中获得每个combobox里的ComboBoxItem对象,谢谢了~

    2011年6月7日 2:48

答案

  • foreach(ComboboxItem sender in myCombobox) { sender(sender就是获取到的Combobox中Item) }

    • 已标记为答案 Colinfc 2011年6月8日 5:12
    • 取消答案标记 Colinfc 2011年6月8日 5:12
    • 已标记为答案 Colinfc 2011年6月15日 1:45
    2011年6月7日 5:29
  • 这里分两种情况,第一种,你没有在ComboBox上用绑定,你是直接在ComboBox中添加ComboBoxItem的,那么你可以用 MaJiXiang 的方法,直接遍历 ComboBox.Items,因为这个时候 Items集合是ComboBoxItem对象的集合。

    foreach(ComboboxItem item in myCombobox.Items)
    

     

    第二种,如果你使用了绑定或者指定了一个ItemsSource,那么Items集合是一个你绑定的或者指定的对象的集合,比如你绑定了一个List<String>集合,那么Items中就是一个个字符串构成的集合,不是ComboBoxItem。这个时候的ComboBoxItem我们称作ItemContainer,是用来包装每一项并且让ComboBox接受去显示在ComboBox里面。 每一种ItemsControl都有他自己对应的ItemContainer类型,ComboBox对应ComboBoxItem, ListBox对应ListBoxItem,ListView对应ListViewItem,  TabControl对应TabItem 等等

    所以这种情况下,你可以用下面的代码去获得每一项的包装 ItemContainer:

      myComboBox.IsDropDownOpen = true;
      myComboBox.IsDropDownOpen = false;
      foreach (object item in myComboBox.Items)
      {
        ComboBoxItem comboboxItem = myComboBox.ItemContainerGenerator.ContainerFromItem(item) as ComboBoxItem;
      }

     

    注:为什么我要显式的展开她的下拉项,然后再关闭。因为WPF为了优化性能,初始化ComboBox之后,在还没有打开下拉项之前是不为每一项生成ItemContainer, 也就是说你如果不显式地打开一下,你是获得不到ComboBoxItem的。

     

    Sincerely,

     


    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    • 已标记为答案 Colinfc 2011年6月8日 5:12
    2011年6月7日 7:44
    版主

全部回复

  • foreach(ComboboxItem sender in myCombobox) { sender(sender就是获取到的Combobox中Item) }

    • 已标记为答案 Colinfc 2011年6月8日 5:12
    • 取消答案标记 Colinfc 2011年6月8日 5:12
    • 已标记为答案 Colinfc 2011年6月15日 1:45
    2011年6月7日 5:29
  • 这里分两种情况,第一种,你没有在ComboBox上用绑定,你是直接在ComboBox中添加ComboBoxItem的,那么你可以用 MaJiXiang 的方法,直接遍历 ComboBox.Items,因为这个时候 Items集合是ComboBoxItem对象的集合。

    foreach(ComboboxItem item in myCombobox.Items)
    

     

    第二种,如果你使用了绑定或者指定了一个ItemsSource,那么Items集合是一个你绑定的或者指定的对象的集合,比如你绑定了一个List<String>集合,那么Items中就是一个个字符串构成的集合,不是ComboBoxItem。这个时候的ComboBoxItem我们称作ItemContainer,是用来包装每一项并且让ComboBox接受去显示在ComboBox里面。 每一种ItemsControl都有他自己对应的ItemContainer类型,ComboBox对应ComboBoxItem, ListBox对应ListBoxItem,ListView对应ListViewItem,  TabControl对应TabItem 等等

    所以这种情况下,你可以用下面的代码去获得每一项的包装 ItemContainer:

      myComboBox.IsDropDownOpen = true;
      myComboBox.IsDropDownOpen = false;
      foreach (object item in myComboBox.Items)
      {
        ComboBoxItem comboboxItem = myComboBox.ItemContainerGenerator.ContainerFromItem(item) as ComboBoxItem;
      }

     

    注:为什么我要显式的展开她的下拉项,然后再关闭。因为WPF为了优化性能,初始化ComboBox之后,在还没有打开下拉项之前是不为每一项生成ItemContainer, 也就是说你如果不显式地打开一下,你是获得不到ComboBoxItem的。

     

    Sincerely,

     


    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    • 已标记为答案 Colinfc 2011年6月8日 5:12
    2011年6月7日 7:44
    版主