选择组合框.按字符串项目

本文关键字:字符串 项目 组合 选择 | 更新日期: 2023-09-27 18:25:34

我有一个名为comType_1的组合框,其中包含某些可选字符串。我有一个变量k.Type_1,它包含所需的字符串。

示例:

k.Type_1包含"测试"。comType_1包含一个名为"测试"的项目。如何选择此项目?

我试过很多东西,但都不起作用:

comType_1.SelectedValue = k.Type_1;
comType_1.SelectedValue = comType_1.Items.IndexOf(k.Type_1);
comType_1.SelectedItem = comType_1.Items.Equals(k.Type_1);

我使用的是Visual Studio 2015社区,这个应用程序是一个WPF应用程序。

选择组合框.按字符串项目

首先,您需要更新ComboxBox标记以包含SelectedValuePath=Content,

示例:

<ComboBox Name="combo1" SelectedValuePath="Content">

然后你可以执行任务:

  comType_1.SelectedValue = k.Type_1;

当您试图将SelectedValue设置为字符串时,您说ComboBox项是对象。

ComboBox在尝试设置SelectedItem时通过引用比较项目,因此您的字符串永远不会与ComboBox中的对象匹配。

我建议将SelectedValuePath设置为包含字符串的对象的属性,然后也可以将SelectedValue设置为字符串。

public class MyObject()
{
    public string Name { get; set; }
}
<ComboBox x:Name="comType_1" ItemsSource="{Binding MyCollection}"
          SelectedValuePath="Name" DisplayMemberPath="Name" />
comType_1.SelectedItem = "Test";

作为一种替代方案,您可以覆盖对象的.Equals,以便它与字符串进行正确比较并返回true(不建议使用,如果您这样做,您可能也想覆盖GetHasCode()

public class MyObject()
{
    public string Name { get; set; }
    public override bool Equals(object obj) 
    { 
        if (obj == null) 
            return false; 
        if (obj is string)
            return (string)obj == this.Name;
        if (obj is MyClass)
            return ((MyClass)obj).Name == this.Name); 
        return false;
    }
}

第三种选择是将组合框项目投射到对象中,并根据字符串检查正确的对象,然后设置SelectedItem

var items = comType_1.Items as ObservableCollection<MyObject>;
if (items == null)
    return;
foreach(MyObject item in items)
{
    if (item.Name == k.Type_1)
    {
        comType_1.SelectedItem = item;
        break;
    }
}

在这三种选择中,我推荐第一种。