Как связать ComboBox с универсальным списком с глубокими свойствами DisplayMember и ValueMember? - PullRequest
6 голосов
/ 15 апреля 2011

Я пытаюсь привязать общий список, такой как 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.Parent» отображается в моем ComboBox вместо «ПОКАЗАТЬ ЭТО». Как я могу связать ComboBox с универсальным списком через один уровень или более глубокие свойства, например, child.DisplayMember ??

Заранее спасибо, Адольфо

Ответы [ 3 ]

8 голосов
/ 15 апреля 2011

Я не думаю, что вы можете делать то, что пытаетесь.Дизайн выше показывает, что у Родителя может быть только один ребенок.Это правда?Или вы упростили дизайн для целей этого вопроса.

Что бы я ни рекомендовал, независимо от того, может ли родитель иметь несколько детей, вы должны использовать анонимный тип в качестве источника данных для поля со списком,и заполнить этот тип с помощью 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;     
}
0 голосов
/ 26 марта 2012

Вы можете просто перехватить событие изменения источника данных и выполнить там определенные привязки объектов.

0 голосов
/ 15 апреля 2011

Это сделает работу:

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;
...