如何将Entity Framework的关联绑定到ComboBox?

7
我正在开发一个内部软件跟踪程序,每个程序修订版本都会从员工数据库中分配一个主要程序员。目前我的简单模型如下所示:

Entity Framework model

一开始我有一个RevisionBindingSource对象,它绑定到我的Revisions集合:
Dim container as new EntityContainer
revisionBindingSource.DataSource = container.Revisions
...
dgRevisions.DataSource = revisionBindingSource
dgRevisions.DataMemeber = ""

这个功能非常好用,我能够绑定到我所需要的各种属性,比如应用程序标题:

lblAppTitle.DataBindings.Add("Text",revisionBindingSource,"Application.Title")

然而,我现在需要一个ComboBox,它的选项绑定到员工列表,并且所选值绑定到当前版本的首席程序员。我尝试创建一个新的employeeBindingSource,但是发现我没有绑定成员Value

employeeBindingSource.DataSource = container.Employees
...
cboLead.DataSource = employeeBindingSource
cboLead.DisplayMember = "Name.Display" 'Name is a complex type'
cboLead.ValueMember = '??

因此,我重写了一些绑定,只使用了一个bindingSource

bindingSource.DataSource = container
...
dgRevisions.DataSource = bindingSource
dgRevisions.DataMemeber = "Revisions"
...
cboLead.DataSource = bindingSource
cboLead.DisplayMember = "Employees.Name.Display"
cboLead.ValueMember = "Employees"
...
lblAppTitle.DataBindings.Add("Text",bindingSource,"Revisions.Application.Title")

这仍然无法在ComboBox中填充任何内容。
对于我来说,哪种模式更好——使用两个不同的绑定源还是一个绑定源?我在绑定ComboBox时做错了什么?一旦我的ComboBox填充,如何将当前值绑定到版本的主程序员?
对不起,问题太啰嗦了,谢谢。

你的问题表述清晰,加一分。 - Mouna Cheikhna
1
你使用哪个UI框架?WinForms吗?添加一个标签以获得更好的答案。 - Scott Munro
一些付费控件可以实现这个功能(我正在使用DevExpress,它允许这样做)。您可以考虑编写一个自定义的Combobox,它扩展了常规的combobox并返回您所需的内容。 - Anderson Matos
你是不是忘记做类似这样的事情了 - cboLead.DataBind()? - Yacov
1个回答

3
在表单上有多个绑定源是没有问题的。事实上,像你上面建议的“链接”多个绑定源可以是一种方便的策略。
然而,在这种情况下,缺少一个连接需要填充以支持将.Value属性绑定到实际的EF对象:您需要创建一个单独的类进行绑定。当绑定到枚举时,这种技术也非常有用。
当您的EF数据模型与您想要的UI不完全匹配时,这种技术非常常见。对于WPF(而不是此示例中的WinForms),这通常被称为ViewModel的一部分。做几次后,这将变得轻车熟路。
以下是您需要创建的类的示例实现:
public class EmployeeBindingObject
{
    public Employee Employee { get; private set; }
    public string EmployeeName 
    { 
        get { return this.Employee.Name; }
    }

    private EmployeeBindingObject(Employee employee)
    {
        this.Employee = employee;
    }

    /// <summary>
    /// Gets a binding list for a specified list of Employees.
    /// </summary>
    /// <param name="types"></param>
    /// <returns></returns>
    public static IBindingList GetBindingList(IEnumerable<Employee> employees)
    {
        BindingList<EmployeeBindingObject> result = new BindingList<EmployeeBindingObject>();

        foreach (var ee in employees)
        {
            result.Add(new EmployeeBindingObject(ee));
        }

        return result;
    }
}

创建完这个类后,您应该进行编译,然后为EmployeeBindingObject创建一个数据源(Data -> Add New Data Source...)。
  1. Set the ValueMember to Employee
  2. Set the DisplayMember to EmployeeName
  3. Set the SelectedValue property to your other BindingSource's Employee property.
  4. Then, in your code, you need to initialize the binding object BindingSource as follows:

     employeeBindingObjectBindingSource.DataSource = 
         EmployeeBindingObject.GetBindingList(container.Employees)
    

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接