我有一个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
答案 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; - 需要更多内存。