Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Winforms 如何将实体框架关联绑定到组合框?_Winforms_Entity Framework_Data Binding_Ado.net - Fatal编程技术网

Winforms 如何将实体框架关联绑定到组合框?

Winforms 如何将实体框架关联绑定到组合框?,winforms,entity-framework,data-binding,ado.net,Winforms,Entity Framework,Data Binding,Ado.net,我正在开发一个内部软件跟踪程序,每个程序修订版都会从员工数据库中分配一名首席程序员。到目前为止,我的简单模型如下所示: 最初我有一个RevisionBindingSource对象,它绑定到我的Revisions集合: Dim container as new EntityContainer revisionBindingSource.DataSource = container.Revisions ... dgRevisions.DataSource = revisionBindingSour

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

最初我有一个
RevisionBindingSource
对象,它绑定到我的
Revisions
集合:

Dim container as new EntityContainer
revisionBindingSource.DataSource = container.Revisions
...
dgRevisions.DataSource = revisionBindingSource
dgRevisions.DataMemeber = ""
这很有效,我能够绑定到我需要的各种属性,例如应用程序标题:

lblAppTitle.DataBindings.Add("Text",revisionBindingSource,"Application.Title")
但是,我现在需要一个组合框,其项目绑定到员工列表,其选定值绑定到当前版本的首席程序员。我尝试创建一个新的
employeeBindingSource
,但意识到我没有
值的绑定成员:

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")
这甚至不会在组合框中填充任何内容

两个不同的绑定源,还是一个,哪个模式更适合我使用?我在绑定组合框时做错了什么?一旦我的组合框填充完毕,我如何将当前值绑定到修订版的首席程序员


很抱歉提出这么冗长的问题,谢谢。

表单上有多个绑定源没有什么错。事实上,像您上面建议的那样,“链接”绑定源可能是一种方便的策略

但是,在这种情况下,您需要填写一个缺少的链接,以支持将
.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;
    }
}

+为了更好地表达您的问题,您使用的是什么UI框架。WinForms?添加标签以获得更好的答案。一些付费控件会这样做(我正在使用DevExpress,它允许这样做)。您可能会考虑编写一个自定义组合框,该组合框从常规组合框中扩展,并返回您需要的东西。您忘记了这样做吗?CBOEAD.DATABDIN()?
 employeeBindingObjectBindingSource.DataSource = 
     EmployeeBindingObject.GetBindingList(container.Employees)