0

在下面显示的代码注释中突出显示的以下错误需要帮助以下方法的目的是按值查找组合框项并将其设置为组合框(如果存在),否则将其添加到组合框然后设置它。

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)我在评论中显示的行出现错误。我该如何防止它。

4

2 回答 2

1

这里的问题是您正在向组合框的项目添加一个字符串:

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)
{
    ...
}
于 2012-08-08T10:11:30.920 回答
0

正如 Clemens 已经建议的那样,您不应该混合 ComboBoxItems 和 String。从 XAML 添加到组合框 ComboBoxItems,从代码添加字符串。一个简单的解决方案是将所有项目设置为字符串。为此,您也应该从代码中添加 Yes, No 项目。然后你的 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");
于 2012-08-08T10:51:35.223 回答