WinForms中的下拉绑定

Kha*_*ash 5 .net c# data-binding winforms

想象一下这两个类:

class Part
{
 public string Name { get; set;}
 public int Id { get; set; }
}

class MainClass
{
 public Part APart { get; set;}
}
Run Code Online (Sandbox Code Playgroud)

如何将MainClass绑定到WinForm上的组合框,因此它显示Part.Name(DisplayMember = "Name";),并且组合的选定项设置MainClass的APart属性,而无需处理下拉列表中的任何事件.

据我所知,将ComboBox的ValueMember设置为"Id"意味着它将尝试将APart设置为不正确的数字(Id).

希望这很清楚!

lc.*_*lc. 1

您正在寻找的是让ValueMember(= ComboBox.SelectedItem) 成为对对象本身的引用,而DisplayMember是该项目的单个属性,对吗?据我所知,由于方式和工作ComboBox的原因,如果不创建自己的并自己进行绑定,就没有好的方法来做到这一点。ValueMemberDisplayMember

但是,您可以尝试以下几件事(假设您在某处有 s 的集合Part):

  1. 重写“Part”的“ToString()”方法以返回“Name”属性。然后将“ComboBox”的“ValueMember”设置为“APart”并将“DisplayMember”保留为空。(未经测试,所以不能保证)
  2. 您可以在 Part 中创建一个新属性以返回对其自身的引用。将“ValueMember”设置为新属性,将“DisplayMember”设置为“Name”。这可能感觉有点像黑客,但它应该有效。
  3. 使用“APart” getter 和 setter 做一些有趣的事情。您将失去一些强类型,但如果您将“APart”设置为对象,并且“MainClass”包含“Part”的集合,则可以通过“Id”(“int”)或“Part”来设置它。(显然,当您将 ComboBox 绑定到它时,您需要通过 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");
    }
}
Run Code Online (Sandbox Code Playgroud)