在ComboBox中使用Class作为ValueMember

时间:2017-06-27 13:49:24

标签: c# winforms combobox datasource

我有一个ComboBox,它目前使用一个简单的类,包含 Name ID 名称用作DisplayMember,而 ID 用作ValueMember。但是,我实际上希望在选择项目时同时传递 Name ID ,因为这样可以省去以后查找名称的操作。当然我可以单独存储它们,但这似乎是rendundat,因为它们来自同一个地方。

因此产生了我的问题:是否可以使用ValueMember的{​​{1}}类(我从中获取名称和ID)?

我在想这样的事情:

ComboBox

我的装备类看起来像这样:

cboCategory.DataSource = viewModel.categoryOptions; // Type: BindingList<Equipment>
cboCategory.DisplayMember = "Name";
cboCategory.ValueMember = ???   // <--- This is where I run out of ideas

2 个答案:

答案 0 :(得分:2)

您可以使用组合框的SelectedItem属性访问所选实例 在使用之前,只有您需要使用Eqipment类型,因为SelectedItem属于object类型。

var selectedEquipment = (Equipment)combobox.SelectedItem;

您也可以使用数据绑定来保持您的viewmodel&#34;松散耦合&#34;

cboCategory.DataSource = viewModel.categoryOptions;
cboCategory.DisplayMember = "Name";
cboCategory.ValueMember = "Id";

cboCategory.DataBinding.Add("SelectedItem", viewModel, "SelectedEquipment", true);

当您在组合框中更改所选项目时,将更新数据绑定viewmodel.SelectedEquipment属性。

答案 1 :(得分:0)

如果没有添加第三个属性,你可以用纯C#实现这一点,你可以将 Name ID 组合在一起。 您可以考虑第三个属性安全性,如:

  • 只有get
  • 就足够了
  • 是否足够protected

当您使用XAML或WinForms时,有MultiBinding机制来实现类似的行为。恕我直言,多重绑定在大多数情况下是开销,创建第三个属性更有利。

所以你的课程看起来像是:

public class Equipment
{
    private int id;
    private string name;

    public Equipment (int id, string name)
    {
        this.id = id;
        this.name = name;
    }

    public int Id
    {
        get { return id; }
        set { id = value; }
    }

    public string Name
    {
        get { return name; }
        set { name = value; }
    }

    public string Identifier
    {
        get { return Id.ToString() + " " + Name; }
    }
}

您可以使用INotifyPropertyChanged扩展 ViewModel ,并在名称 ID 标识符更改>改变。

更复杂(如果需要)将返回对象数组而不是字符串,因此您不会在转换时丢失数据(ID.ToString())&lt; - 需要更多内存。