检查ComboBox中是否包含项目

11

我有这个:

<ComboBox SelectedValuePath="Content" x:Name="cb">
  <ComboBoxItem>Combo</ComboBoxItem>
  <ComboBoxItem>Box</ComboBoxItem>
  <ComboBoxItem>Item</ComboBoxItem>
</ComboBox>

如果我使用

cb.Items.Contains("Combo")
或者
cb.Items.Contains(new ComboBoxItem {Content = "Combo"})

它会返回 False

有人能告诉我如何检查名为 ComboComboBoxItem 是否存在于名为 cbComboBox 中吗?


2
ComboBox没有名称,那你是怎么引用它的? - paparazzo
最好发布能够重现问题的代码。 - paparazzo
3
如果您需要速度,则将源绑定到字符串的 HashSet,并测试 HashSet 是否包含该字符串。如果您需要动态插入和删除,则使用 ObservableCollection。使用 ComboBox 作为集合不是最优选择。 - paparazzo
@Blam 无法使用 HashSet,因为我正在为一些 ComboBoxItem 进行样式设置。 - Elmo
3个回答

16

“Items”是一个“ItemCollection”,而不是字符串列表。在您的情况下,它是一个“ComboboxItem”的集合,并且您需要检查其“Content”属性。

cb.Items.Cast<ComboBoxItem>().Any(cbi => cbi.Content.Equals("Combo"));

或者

cb.Items.OfType<ComboBoxItem>().Any(cbi => cbi.Content.Equals("Combo"));

您可以遍历每个项目,并在找到所需项目时中断 -
bool itemExists = false;
foreach (ComboBoxItem cbi in cb.Items)
{
    itemExists = cbi.Content.Equals("Combo");
    if (itemExists) break;
}

我没明白。Contains 方法也会在内部循环整个列表,直到找到所需的元素。 - Rohit Vats
不错的观察。那么,你还在寻找其他的替代方案吗? - Rohit Vats
是的,在我提出问题之前,我已经考虑过循环选项了。 - Elmo
@别忘了点赞 如果您不介意使用另一个集合,则可以使用Dictionary<K,V>将ComboBox中的项与同步,并检查字典而不是检查ComboBox。这将提高性能,但并不是一个好的解决方案。 - Sriram Sakthivel
不,我不能使用任何“Collection”,因为我正在为一些“ComboBoxItem”设置样式。我想我只能使用循环选项。我认为没有其他选择了。 - Elmo
显示剩余3条评论

6
如果你想在 cb.Items.Contains("Combo") 中使用Contains函数,你需要将字符串添加到你的ComboBox中,而不是ComboBoxItems:cb.Items.Add("Combo")。这个字符串将会像一个ComboBoxItem一样显示。

0

在 C# Winform 应用程序中,您可以执行以下操作:

//创建一个如下的函数

internal static bool CheckCombo(ComboBox.ObjectCollection items, string Search)
{
    bool isFound = false;
    foreach (var item in items)
    {
        if (item.Equals(Search))
        {
            isFound = true; break;
        }
    }
    return isFound;
}

当向组合框添加项目时,您可以像这样调用函数。

if (!Functions.CheckCombo(Combobox.Items, "ValueToSearch"))
{
  //Adding the value if is not found in the combobox
  Combobox.Items.Add("ValueToSearch");
}


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接