13

在安装了 Net Framework 3.5 sp1 的 wpf 应用程序中以编程方式设置 SelectedItem 时,我感到很困惑。我已经仔细阅读了大约一百个帖子\主题,但仍然感到困惑((我的 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 不是只读属性,为什么它不起作用?我认为那应该是微软的问题,而不是我的。或者我错过了什么???我尝试过使用 ListBox,并且使用相同的代码都可以正常工作,我可以设置选择,获取选择等等......那么我可以用 ComboBox 做什么?也许有些技巧???

4

6 回答 6

12

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

combobox.SelectedIndex = 0; //index should be the index of item which you want to be selected
于 2012-06-30T10:12:56.190 回答
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编程方式设置属性,然后将文本设置为所选值,它也可以工作。

于 2010-11-16T22:20:39.480 回答
6

在您的视图模型中为主题列表和所选项目创建一个公共属性:

    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";

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

于 2010-11-16T23:07:14.163 回答
2

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

cbTheme.SelectedIndex = 1;

我发现当你不知道索引时,你就会遇到真正的问题。我知道这超出了最初的问题,但是对于那些想知道如何在索引未知但您想要显示的值已知时设置项目的 Google 员工,如果您使用ItemSourcefrom填充下拉列表例如,您可以通过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;

如果按照 OP 显示的方式填充,则ComboBoxItem项目而不是行的类似迭代DataRow可能会产生类似的结果。ComboBox

于 2016-11-07T17:54:47.910 回答
0

ComboBox 数据是否绑定?

如果是这样,您可能最好通过绑定而不是代码来做到这一点......

看到这个问题... WPF ListView Programmatically Select Item

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

本质上是在模型中设置 IsCurrentlySelected 属性并从模型中更新 UI。

于 2010-02-10T03:06:39.523 回答
0

根据答案 4

如果您已经在项目源中添加了项目。触发选择集值的 PropertyChangedEvent。

tmpList.Add("Sunrise theme"); 
    tmpList.Add("Sunset theme");
    PropertyChangedEvent.Notify(this,"SelectedItem");
于 2012-04-12T06:47:22.487 回答