如何将ComboBox绑定到具有深层DisplayMember和ValueMember属性的泛型列表

本文关键字:ValueMember DisplayMember 属性 列表 泛型 ComboBox 绑定 | 更新日期: 2023-09-27 17:50:14

我正在尝试将一个通用列表(如list Parents)绑定到ComboBox。

    public Form1()
    {
        InitializeComponent();
        List<Parent> parents = new List<Parent>();
        Parent p = new Parent();
        p.child = new Child();
        p.child.DisplayMember="SHOW THIS";
        p.child.ValueMember = 666;
        parents.Add(p);
        comboBox1.DisplayMember = "child.DisplayMember";
        comboBox1.ValueMember = "child.ValueMember";
        comboBox1.DataSource = parents;
    }
}
public class Parent
{
    public Child child { get; set; }
}
public class Child
{
    public string DisplayMember { get; set; }
    public int ValueMember { get; set; }
}

当我运行我的测试应用程序时,我只看到:"ComboBindingToListTest。显示在我的组合框中,而不是"SHOW THIS"。如何通过一个级别或更深的属性(例如child.DisplayMember)将ComboBox绑定到通用列表??

提前感谢阿道夫•

如何将ComboBox绑定到具有深层DisplayMember和ValueMember属性的泛型列表

我认为你做不到你想做的事。上面的设计表明,一个Parent只能有一个子节点。这是真的吗?还是为了回答这个问题而简化了设计?

无论父节点是否可以有多个子节点,我建议您使用匿名类型作为组合框的数据源,并使用linq填充该类型。下面是一个例子:

private void Form1_Load(object sender, EventArgs e)
{
    List<Parent> parents = new List<Parent>();
    Parent p = new Parent();
    p.child = new Child();
    p.child.DisplayMember = "SHOW THIS";
    p.child.ValueMember = 666;
    parents.Add(p);
    var children =
        (from parent in parents
            select new
            {
                DisplayMember = parent.child.DisplayMember,
                ValueMember = parent.child.ValueMember
            }).ToList();
    comboBox1.DisplayMember = "DisplayMember";
    comboBox1.ValueMember = "ValueMember";
    comboBox1.DataSource = children;     
}

这样就可以了:

Dictionary<String, String> children = new Dictionary<String, String>();
children["666"] = "Show THIS";
comboBox1.DataSource = children;
comboBox1.DataBind();

如果Children在父类中,那么你可以简单地使用:

comboBox1.DataSource = parent.Children;
...

但是,如果你需要绑定到多个父节点的子节点,你可以这样做:

var allChildren =
   from parent in parentList
   from child in parent.Children
   select child
comboBox1.DataSource = allChildren;

您可以拦截数据源更改事件并在其中执行特定的对象绑定。