以编程方式在WPF(3.5sp1)中设置ComboBox SelectedItem

时间:2010-02-10 02:40:43

标签: wpf combobox selecteditem

在安装了Net Framework 3.5 sp1的wpf应用程序中设置SelectedItem programmaticaly时,我感到很困惑。我仔细阅读了大约一百个帖子\主题但仍然困惑(( 我的xaml:

 <ComboBox name="cbTheme">
    <ComboBoxItem>Sunrise theme</ComboBoxItem>
    <ComboBoxItem>Sunset theme</ComboBoxItem> 
 </ComboBox>

如果我在其中一个项目中添加 IsSelected =“True”属性 - 它不会设置此项目。为什么? 而我在代码中尝试不同,仍然无法设置所选项目:

cbTheme.SelectedItem=cbTheme.Items.GetItemAt(1); //dosn't work
cbTheme.Text = "Sunrise theme"; //dosn't work
cbTheme.Text = cbTheme.Items.GetItemAt(1).ToString();//dosn't work
cbTheme.SelectedValue = ...//dosn't work
cbTheme.SelectedValuePath = .. //dosn't work
//and even this dosn't work:
ComboBoxItem selcbi = (ComboBoxItem)cbTheme.Items.GetItemAt(1);//or selcbi = new ComboBoxItem
cbTheme.SelectedItem = selcbi;

SelectedItem不是readonly属性,为什么它不工作? 我认为这应该是微软的问题,而不是我的问题。或者我错过了什么?我尝试使用ListBox,并且所有工作都可以正常使用相同的代码,我可以设置选择,获取选择等等......那么我可以用ComboBox做什么?也许一些招数???

6 个答案:

答案 0 :(得分:9)

要选择ComboBox中的任何项目并将其设置为默认项目,请使用以下行:

combobox.SelectedIndex = 0; //index should be the index of item which you want to be selected

答案 1 :(得分:7)

如果我以编程方式添加组合框和项目,这对我有用:

ComboBox newCombo = new ComboBox();

ComboBoxItem newitem = new ComboBoxItem();
newitem.Content = "test 1";
newCombo.Items.Add(newitem);
newitem = new ComboBoxItem();
newitem.Content = "test 2";
newCombo.Items.Add(newitem);
newitem = new ComboBoxItem();
newitem.Content = "test 3";
newCombo.Items.Add(newitem);

newCombo.SelectedItem =  ((ComboBoxItem)newCombo.Items[1]);
newCombo.Text = ((ComboBoxItem)newCombo.Items[1]).Content.ToString();

newStack.Children.Add(newCombo);

如果以编程方式设置ItemSource属性,然后将文本设置为所选值,它也可以工作。

答案 2 :(得分:5)

在viewmodel中为主题列表创建一个公共属性,并为所选项目创建一个公共属性:

    private IEnumerable<string> _themeList;
    public IEnumerable<string> ThemeList
    {
        get { return _themeList; }
        set
        {
            _themeList = value;
            PropertyChangedEvent.Notify(this, "ThemeList");
        }
    }
    private string _selectedItem;
    public string SelectedItem
    {
        get { return _selectedItem; }
        set
        {
            _selectedItem = value;
            PropertyChangedEvent.Notify(this,"SelectedItem");
        }            
    }

将xaml中的组合框绑定到如下属性:

    <ComboBox 
        Name="cbTheme" 
        ItemsSource="{Binding ThemeList}"      
        SelectedItem="{Binding SelectedItem}">
    </ComboBox>

现在您所做的只是将项目添加到ThemeList以填充组合框。要选择列表中的项目,请将selected属性设置为要选择的项目的文本,如下所示:

    var tmpList = new List<string>();
    tmpList.Add("Sunrise theme");
    tmpList.Add("Sunset theme");

    _viewModel.ThemeList = tmpList;
    _viewModel.SelectedItem = "Sunset theme";

或尝试将所选项目设置为您想要在自己的代码中选择的项目的字符串值,如果您想使用您当前拥有的代码 - 不确定它是否可行,但您可以尝试。

答案 3 :(得分:1)

如果您知道要设置的项目的索引,在这种情况下,您似乎尝试设置索引1,您只需执行以下操作:

cbTheme.SelectedIndex = 1;

我发现当你不知道索引时,那就是当你遇到真正的问题时。我知道这超出了原来的问题,但对于那个想要知道如何设置项目的Google员工,当索引尚未知但你想要显示的值已知时,如果你填写你的下拉列表例如,来自ItemSource的{​​{1}},您可以通过以下方式获取该索引:

DataTable

然后你只做int matchedIndex = 0; if (dt != null & dt.Rows != null) { if (dt.Rows.Count > 0) { foreach (DataRow dr in dt.Rows) { string myRowValue = dr["SOME_COLUMN"] != null ? dr["SOME_COLUMN"].ToString() : String.Empty; if (myRowValue == "Value I Want To Set") break; else matchedIndex++; } } }

类似的cbTheme.SelectedIndex = matchedIndex;项而非ComboBoxItem行的迭代可能会产生类似的结果,如果DataRow填充了OP的显示方式,而不是。

答案 4 :(得分:0)

是否绑定了ComboBox数据?

如果是这样,你最好通过Binding而不是代码来实现....

请参阅此问题... WPF ListView Programmatically Select Item

也许创建一个新的SelectableObject {Text =“Abc Theme”,IsCurrentlySelected = True} 将SelectableObjects的集合绑定到ComboBox。

基本上在模型中设置IsCurrentlySelected属性并从模型中进行UI更新。

答案 5 :(得分:0)

措辞答案4

如果您已在项目来源中添加项目。 触发selectet Value的PropertyChangedEvent。

tmpList.Add("Sunrise theme"); 
    tmpList.Add("Sunset theme");
    PropertyChangedEvent.Notify(this,"SelectedItem");