如何设置组合框选择值

时间:2012-08-08 09:57:04

标签: wpf combobox

在下面显示的代码注释中突出显示以下错误需要帮助 以下方法的目的是通过值找到一个combox项目,如果存在则将其设置为组合框,否则将其添加到组合框然后进行设置。

private void SetComboBoxValueHelper(ComboBox cb, string valuetoSet)
    {
        bool isValueNotFound = false;

        cb.SelectedValue = valuetoSet;
        isValueNotFound = string.IsNullOrEmpty(Convert.ToString(cb.SelectedValue));

        if (isValueNotFound)
        {   
            //try to ignore case and find the item in combobox
            foreach (ComboBoxItem item in cb.Items) //1.ERROR AFTER ANY ITEM ADDED using my code
            {
                if (string.Compare(Convert.ToString(item.Content), valuetoSet, true) == 0)
                {
                    cb.SelectedValue = item.Content;
                    isValueNotFound = false;
                }
            }

            //if still not found add the item to the combobox
            if (isValueNotFound)
            {
                cb.Items.Add(valuetoSet);
                cb.SelectedValue = valuetoSet;//2.THIS IS NOT WORKING
            }
        }
    }

我使用的样品组合框

<ComboBox Grid.Column="5" Grid.Row="4" Margin="10" Name="cbbox1" SelectedValuePath="Content">
        <ComboBoxItem Content="No" IsSelected="True"  />
        <ComboBoxItem Content="Yes"  />
    </ComboBox>

请告诉我 a)我如何解决这条非工作线。 b)我在评论中显示的行中收到错误。我该如何防止它。

2 个答案:

答案 0 :(得分:1)

这里的问题是你要在ComboBox的项目中添加一个字符串:

cb.Items.Add(valuetoSet);

您应该添加一个新的ComboBoxItem:

cb.Items.Add(new ComboBoxItem { Content = valuetoSet }); 

否则,您将在Items集合中混合ComboBoxItems和字符串。现在,当您将项目作为ComboBoxItems进行迭代时,遇到添加的字符串项时会出现异常。

但是,您应该考虑使用字符串项而不是ComboBoxItems。这样可以使您的代码更清晰,您可以直接通过SelectedItem属性处理所选字符串项,而无需SelectedValuePathConvert.ToString(item.Content)之类的内容。

您甚至可以在XAML中定义初始项目字符串,如下所示:

<ComboBox xmlns:sys="clr-namespace:System;assembly=mscorlib"
          SelectedIndex="0" ...>
    <sys:String>No</sys:String>
    <sys:String>Yes</sys:String>
</ComboBox>

现在你的整个SetComboBoxValueHelper方法会像Novitchi所写的那样简化:

private void SetComboBoxValueHelper(ComboBox cb, string valuetoSet)              
{              
    if (!cb.Items.Contains(valuetoSet))
    {
        cb.Items.Add(valuetoSet);
    }

    cb.SelectedItem = valuetoSet;              
}

编辑:如果仍然需要迭代项目,你也会迭代字符串而不是ComboBoxItems:

foreach (string item in cb.Items)
{
    ...
}

答案 1 :(得分:0)

正如Clemens已经建议你不要混合使用ComboBoxItems和String。从XAML中,您可以从添加字符串的代码中添加到combobox ComboBoxItems。一个简单的解决方案是将所有Items设置为字符串。为此,您应该从代码中添加Yes,No items。 然后你的SetComboBoxValueHelper应如下所示:

    private void SetComboBoxValueHelper(ComboBox cb, string valuetoSet)
    {
        bool valueNotFound = !cb.Items.Contains(valuetoSet);

        if (valueNotFound)
            cb.Items.Add(valuetoSet);

        cb.SelectedItem = valuetoSet;
    }

wpf将为您创建ComboBoxItem,您可以使用

获取它
   cb.ItemContainerGenerator.ContainerFromItem("ItemString");