想象一下这两个类:
class Part
{
public string Name { get; set;}
public int Id { get; set; }
}
class MainClass
{
public Part APart { get; set;}
}
如何将 MainClass 绑定(bind)到 WinForm 上的组合框,以便它显示 Part.Name (DisplayMember = "Name";
) 并且组合的选定项设置MainClass 无需处理下拉列表中的任何事件。
据我所知,将 ComboBox 的 ValueMember 设置为“Id”意味着它将尝试将 APart 设置为不正确的数字 (Id)。
希望这已经够清楚了!
最佳答案
您正在寻找的是 ValueMember
(= ComboBox.SelectedItem
) 是对对象本身的引用,而 DisplayMember
是项目的单一属性,对吗?据我所知,如果不创建自己的 ComboBox
,就没有好的方法可以做到这一点。并自己进行绑定(bind),由于方式 ValueMember
和 DisplayMember
工作。
但是,这里有一些您可以尝试的事情(假设您在某处有一个 Part
的集合):
- 覆盖 `Part` 的 `ToString()` 方法以返回 `Name` 属性。然后将 `ComboBox` 的 `ValueMember` 设置为 `"APart"` 并将 `DisplayMember` 留空。 (未经测试,因此无法保证)
- 您可以在 Part 中创建一个新属性以返回对自身的引用。将“ValueMember”设置为新属性,将“DisplayMember”设置为“Name”。这可能感觉有点像 hack,但它应该有效。
- 用你的 `APart` getter 和 setter 做一些有趣的事情。您将失去一些强类型,但如果您将 `APart` 设为对象并且 `MainClass` 包含 `Part` 的集合,您可以通过 `Id` (`int`) 或 `Part` 设置它。 (显然,当您将 ComboBox 绑定(bind)到它时,您会希望通过 Id 来设置它。)
Part _APart;
object APart
{
get {return _APart;}
set {
if(value is int)
_APart = MyPartCollection.Where(p=>p.Id==value).Single();
else if(value is Part)
_APart = value;
else
throw new ArgumentException("Invalid type for APart");
}
}
关于c# - WinForms 中的下拉绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/696864/